# Mariadb Galera Cluster集群簡介
- MaraiDB集群是MariaDB同步多主機集群,它僅支持XtraDB/InnoDB存儲引擎
- 主要功能:同步復制;真正的multi-master,即所有節點可以同時讀寫數據庫;自動的節點成員控制,失效節點自動清除; 新節點加入數據自動復制;真正的并行復制,行級;用戶可以直接連接集群,使用感受上與MySQL完全一致。
- 優勢:多主,所以不存在Slavelag(延遲);不存在丟失事務的情況;同時具有讀和寫的擴展能力;更小的客戶端延遲;節點間數據是同步的,而Master/Slave模式是異步的,不同slave上的binlog可能是不同的。
# 安裝mariadb Galera
1)在三個節點上分別執行:
```
yum -y install MariaDB-server MariaDB-client galera xinetd rsync ntp ntpdate bash-completion percona-xtrabackup socat gcc gcc-c++
systemctl start mariadb.service
systemctl enable mariadb.service
mysql_secure_installation(執行設置mysql密碼,我的密碼為yjscloud)
```
2)在三個節點上創建sst用戶,目的是給xtraback-v2數據同步使用:
```
grant all privileges on *.* to 'sst'@'localhost' identified by 'yjscloud';
flush privileges;
```
3)配置MariaDB Cluster集群(注:max_allowed_packet、innodb_buffer_pool_size、innodb_log_file_size可以適當調整的參數,以下配置適用于服務器,如果在配置較低的虛擬機上請下調參數值,否則可能導致mariadb無法啟動)
第一個節點,添加內容如下:
```
vim /etc/my.conf.d/client.cnf
```
添加內容:
```
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
```
```
vim /etc/my.cnf.d/server.conf
```
添加的內容:
```
[isamchk]
key_buffer_size = 16M?? #key_buffer_size這個參數是用來設置索引塊(index blocks)緩存的大小,它被所有線程共享,嚴格說是它決定了數據庫索引處理的速度,尤其是索引讀的速度
[mysqld]
datadir=/var/lib/mysql #指定數據data目錄絕對路徑
innodb-data-home-dir = /var/lib/mysql #指定innodb數據庫存放的家目錄
basedir = /usr #指定mariadb的安裝路徑,填寫全路徑可以解決相對路徑所造成的問題
binlog_format=ROW #該參數可以有三種設置值:row、statement和mixed。row代表二進制日志中記錄數據表每一行經過寫操作后被修改的最終值。各個參與同步的salve節點,也會參照這個最終值,將自己數據表上的數據進行修改;statement形式是在日志中記錄數據操作過程,而非最終的執行結果。各個參與同步的salve節點會解析這個過程,并形成最終記錄;mixed設置值,是以上兩種記錄方式的混合體,MySQL服務會自動選擇當前運行狀態下最合適的日志記錄方式
character-set-server = utf8 #設置數據庫的字符集
collation-server = utf8_general_ci #collation是描述數據在數據庫中是按照什么規則來描述字符的,以及字符時如何被排序和比較,這里我們設置的字符格式是utf8-general_ci
max_allowed_packet = 256M #設置mysql接收數據包的最大值,比如你執行的sql語句過大,可能會執行失敗,這個參數就是讓能執行的sql語句大小調高
max_connections = 10000 #設置mysql集群最大的connection連接數,這個在openstack環境里非常重要
ignore-db-dirs = lost+found #設置忽略把lost+found當做數據目錄
init-connect = SET NAMES utf8 #設置初始化字符集編碼(僅對非超級用戶有效)
innodb_autoinc_lock_mode = 2 #這種模式下任何類型的inserts都不會采用AUTO-INC鎖,性能最好,但是在不同一條語句內部產生auto_increment值間隙
innodb_buffer_pool_size = 2000M #設置緩沖池字節大小,innodb緩存表和索引數據的內存區域;這個值設置的越大,在不止一次的訪問相同的數據表數據時,消耗的磁盤I/O就越少。在一個專用的數據庫服務器,則可能將其設置為高達80%的機器物理內存大小。不過在實際的測試中,發現無限的增大這個值,帶來的性能提升也并不顯著,對于cpu的壓力反而增大,設置合理的值才是最優。
innodb_doublewrite = 0 #設置0是禁用doublewrite,一般在不關心數據一致性(比如使用了RAID0)或文件系統可以保證不會出現部分寫失效,你可以通過將innodb_doublewrite參數設置為0還禁用doublewrite。
innodb_file_format = Barracuda #設置文件格式為Barracuda,Barracuda 是innodb-plugin后引入的文件格式,同時Barracuda也支持antelope文件格式,Barracuda在數據壓縮上優于antelope,配合下面的innodb_file_per_table=1使用
innodb_file_per_table = 1 #開啟獨立的表空間,使每個innodb的表,有自己獨立的表空間。如刪除文件后可以回收那部分空間。
innodb_flush_log_at_trx_commit = 2 #默認值1:每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的,特別是使用電池供電緩存(Battery backed up cache)時。設成2:意思是不寫入硬盤而是寫入系統緩存,日志乃然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。設成0寫入會更快一點,但安全方面比較差,mysql掛了可能會丟失事務的數據。設置為2只會在整個操作系統掛了是才會可能丟失數據,所以在openstack環境里設置為2安全點
innodb_flush_method = O_DIRECT #設置打開、刷寫模式,設置O_DIRECT的意思是innodb使用O_DIRECT打開數據文件,使用fsync()更新日志和同步的,因此不管是read()系統調用還是write()系統調用,數據都保證是磁盤上讀取的,所以單純從寫入的角度講O_DIRECT模式性能最差,但是在openstack環境下設置這個模式可以減少操作系統級別vfs的緩存使用內存過多和innodb本身的buffer的緩存沖突,同步也算是給操作系統減少點壓力。
innodb_io_capacity = 500 #這里參數據控制innodb checkpoint時的io能力,一般可以按一塊SAS 15000轉的磁盤200個計算,6塊盤的SAS做的Raid10這里值可以配到600即可。如果是普通的SATA一塊盤只能按100算,這里要注意,對于普通機械盤,由于其隨機IO的IOPS的最多也就是300,所以innodb_io_capacity開的過大,反而回造成磁盤io不均勻;如果是ssd場景,由于IO能力大大增強,所以innodb_io_capacity可以提高,可以配置到2000以上,但是目前的openstack環境為了節約成本都是普通機械硬盤,所以這里一般根據自己環境情況調試值
innodb_locks_unsafe_for_binlog = 1 #開啟事物鎖機制,強制mysql使用多版本數據一致性讀
innodb_log_file_size = 2000M #如果對innodb數據表有大量的寫入操作,那么選擇合適的innodb_log_file_size值提升mysql性能很重要。然而設置太大了,就會增加恢復的時間,因此在mysql奔潰或者突然斷電情況會令mysql服務器花很長時間來恢復。
innodb_read_io_threads = 8 #設置數據庫讀磁盤文件的線程數,用于并發;根據服務器cpu核心數以及讀寫頻率設置
innodb_write_io_threads = 8 #設置數據庫寫磁盤文件的線程數,用于并發;根據服務器cpu核心數以及讀寫頻率設置
key_buffer_size = 64 #這個參數是用來設置索引塊(index blocks)緩存的大小,它被所有線程共享,嚴格說是它決定了數據庫索引處理速度,尤其是索引讀得速度。那我們怎么才能知道key_buffer_size的設置是否合理呢,一般可以檢查狀態值key_read_requests和key_reads,比例key_reads/key_read_requests應該盡可能的低,比如1:100;1:1000,1:10000。其值可以show status like 'key_read%';命令查得
myisam-recover-options = BACKUP #設置自動修復MyISAM表的方式,BACKUP模式會自動修復;這種模式如果恢復過程,數據文件被更改了,會將tbl_name.MYD文件備份為tbl_name-datetime.BAK
myisam_sort_buffer_size = 64M #設置MyISAM表發生變化是重新排序所需要的緩沖值,一般64M足夠
open_files_limit = 102400 #設置最大文件打開數,需要參照OS的ulimit值和max_connections的大小
performance_schema = on #打開收集數據庫性能參數的數據庫
query_cache_limit = 1M #設置單個查詢能夠使用的緩沖區大小
query_cache_size = 0 #關閉query_cache
query_cache_type = 0 #關閉query_cache_type
skip-external-locking #設置跳過“外部鎖定”,當“外部鎖定”起作用是,每個進程若要訪問數據表,則必須等待之前的進程完成操作并解除鎖定;由于服務器訪問數據表時經常需要等待解鎖,因此會讓mysql性能下降,所以這里設置跳過
skip-name-resolve #禁用DNS主機名查找
socket = /var/lib/mysql/mysql.sock #設置mysql.sock的絕對夠路徑
table_open_cache = 10000 #描述符緩存大小,可減少文件打開/關閉次數
thread_cache_size = 8 #可以用show status like 'open%table';查看當前open_tables的值是多少,然后適當調整
thread_stack = 256K #用來存放每個進程的標識信息,如線程id,線程運行時間環境的等,可以通過設置thread_stack來決定給每個線程分配多大的內存
tmpdir = /tmp #設置mysql臨時文件存放的目錄
user = mysql #設置mysql數據的系統賬戶名
wait_timeout = 1800 #設置單個connection空閑連接的超時時間,mysql默認是8小時,這里我們設置為1800秒,也就是說,一個connection如果空閑超過30分鐘,那么就會被釋放
[galera]
bind-address=10.1.1.120 #mysql服務綁定的ip
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.1.1.120,10.1.1.121,10.1.1.122" #gcomm是特殊的地址,僅僅是Galera cluster初始化啟動時候使用
wsrep_cluster_name = openstack #mysql cluster集群名稱
wsrep_node_name=controller1
wsrep_node_address=10.1.1.120 #此節點ip地址
wsrep_on=ON
wsrep_slave_threads=4 #指定線程數量,建議每個core啟動4個復雜線程,這個參數很大程度上受到I/O能力的影響
wsrep_sst_method=xtrabackup-v2 #有xtrabackup模式和rsync模式:新版本的支持xtrabackup-v2模式,rsync在數據同步(SST和IST)的時候,速度最快,但是會鎖住數據節點,然后無法提供訪問;xtrabackup只會短暫的鎖住節點,基本不影響訪問。SST:state snapshot tranter ,節點初始化的方式方式,做數據的全量同步;IST:incremental state tranter ,當一個節點加入,他當前的GUID與集群相同,缺失的數據能夠在donor的writeset的cache中找到,否則只能全部初始化數據走SST模式。經過相關調研,目前xtrabackup-v2模式是最好的SST方式
wsrep_sst_auth=sst:yjscloud #設置sst同步數據所需的mysql用戶和密碼,因此上面我們用的是xtrabackup-v2模式,那么xtrabackup-v2模式就會用到sst這個mysql用戶去做節點之間的驗證,yjscloud是密碼
default_storage_engine=InnoDB #設置數據庫默認引擎為innodb
[mysqld_safe]
nice = 0 #調用系統的nice命令設置進程優先級,linux系統用戶只能在0-19中設置,mysql用戶為普通用戶,設置為0應該就是讓mysql進程優先級最高了
socket = /var/lib/mysql/mysql.sock
syslog
```
```
vim /etc/my.cnf.d/mysql-client.cnf
```
添加的內容:
```
[mysqldump]
max_allowed_packet = 16M #mysql根據配置文件會限制server接受數據包的大小,有時候大的插入和更新會受到max_allowed_packet參數限制,導致寫入或者更新失敗
quick #強制mysqldump從服務查詢取得記錄直接輸出而不是取得所有記錄后將它們緩存到內存中
quote-names #使用()引用表和列名。默認為打開狀態,使用--skip-quote-names取消該選項。
```
第二和第三個個節點的my.cnf配置如下,**注意改下相關ip和節點名稱**:
client.cnf文件直接scp過去
```
scp -p client.cnf controller2:/etc/my.cnf.d/client.cnf
scp -p client.cnf controller3:/etc/my.cnf.d/client.cnf
```
mysql-client.cnf也scp過去其他兩節點
```
scp -p mysql-clients.cnf controller2:/etc/my.cnf.d/mysql-clients.cnf
scp -p mysql-clients.cnf controller3:/etc/my.cnf.d/mysql-clients.cnf
```
server.cnf也用scp拷貝過去
```
scp -p server.cnf controller2:/etc/my.cnf.d/server.cnf
scp -p server.cnf controller3:/etc/my.cnf.d/server.cnf
```
**修改一下server.cnf ip地址和節點名稱**
設置mysql最大連接數
```
vim /usr/lib/systemd/system/mariadb.service
```
在`[Service]`添加兩行如下參數:
```
LimitNOFILE=10000
LimitNPROC=10000
```
```
scp -p /usr/lib/systemd/system/mariadb.service controller2:/usr/lib/systemd/system/mariadb.service
scp -p /usr/lib/systemd/system/mariadb.service controller3:/usr/lib/systemd/system/mariadb.service
```
都修改完畢后:`systemctl daemon-reload`
最后等啟動了mariadb服務就能通過`show variables like 'max_connections';`
4)關于mysql服務的啟動順序
三個節點my.cnf都配置完成后,三個節點的mariadb全部執行:`systemctl stop mariadb.service`
然后在第一個節點用下面的命令初始化啟動mariadb:
```
/usr/sbin/mysqld --wsrep-new-cluster --user=root &
```
其他兩個節點分別啟動mariadb
```
systemctl start mariadb.service
systemctl status mariadb.service
```
最后,其他兩個節點啟動成功了,再回到第一個節點執行:
```
pkill -9 mysql
pkill -9 mysql
systemctl start mariadb.service
systemctl status mariadb.service
```
5)查看mariadb數據庫集群狀態

登錄這兩個節點的mysql里,發現mysql集群數變成了3,說明這個集群有3個節點了,集群已經搭建。
- 獻給我的朋友們
- 一、個人對學習的看法
- 二、運維技能圖譜
- 三、運維常用技能
- 3.1 Vim(最好用的編輯器)
- 3.2 Nginx & Tengine(Web服務)
- 1. Nginx介紹和部署
- 2. Nginx配置解析
- 3. Nginx常用模塊
- 4. Nginx 的session 一致性問題
- 3.3 Tomcat(Web中間件)
- 3.4 Keepalived(負載均衡高可用)
- 3.5 Memcache(分布式緩存)
- 3.6 Zookeeper(分布式協調系統)
- 3.7 KVM(開源虛擬化)
- 1. 虛擬化介紹
- 2. KVM基礎
- 3. 設置VNC和時間同步
- 4. kvm虛擬機快照備份
- 5. kvm虛擬機在線擴展磁盤
- 6. kvm虛擬機靜態遷移
- 7. kvm虛擬機動態遷移
- 8. kvm虛擬機存儲池配置
- 9. cpu添加虛擬化功能
- 3.8 GitLab(版本控制)
- 3.8.1 GitLab安裝與漢化
- 3.9 Jenkins(運維自動化)
- 3.10 WAF(Web防火墻)
- 3.10.1初探WAF
- 四、常用數據庫
- 4.1 MySQL(關系型數據庫)
- 1. MySQL源碼安裝
- 4.2 Mongodb(適用與大數據分析的數據庫)
- 4.3 Redis(非關系數據庫)
- 五、自動化運維工具
- 5.1 Cobbler(系統自動化部署)
- 5.2 Ansible(自動化部署)
- 5.3 Puppet(自動化部署)
- 5.4 SaltStack(自動化運維)
- 六、存儲
- 6.1 GFS(文件型存儲)
- 6.2 Ceph(后端存儲)
- 七、運維監控工具
- 7.1 對監控的理解
- 7.2 Zabbix(運維監控)
- 7.2.1 Zabbix簡介
- 7.2.2 Zabbix服務部署
- 1. Zabbix服務端部署
- 2. Zabbix客服端部署
- 3. 配置前端展示
- 4. zabbix告警配置
- 7.2.3 Zabbix監控服務
- 1. 監控網絡設備
- 2. 自定義Nginx監控
- 7.3 云鏡(安全監控)
- 7.4 ELK(日志收集展示)
- 八、運維云平臺
- 8.1 OpenStack(開源云操作系統)
- 8.1.1 OpenStack簡介
- 8.1.2 實驗架構設計
- 8.1.3 集群環境準備
- 8.1.4 controller節點部署
- 1. 安裝Mariadb Galera Cluster集群
- 2. 安裝RabbitMQ Cluster集群
- 3. 安裝Pacemaker
- 4. 安裝HAProxy
- 5. 安裝配置Keystone
- 6. 安裝配置glance
- 1. 制作鏡像模板
- 7. 安裝配置nova
- 8. 安裝配置neutron
- 1. 配置虛擬機網絡
- 9. 安裝Dashboard
- 10. 安裝配置cinder
- 8.1.5 compute節點部署
- 1. 安裝相關軟件包
- 2. 安裝Neutron
- 3. 配置cinder
- 4. 創建第一個虛擬機
- 8.1.6 OpenStack報錯處理
- 1. cinder僵尸卷刪除
- 8.1.7 快速孵化虛擬機方案
- 8.1.8 Kolla容器化部署OpenStack
- 1. 單點部署
- 2. 多節點部署
- 8.2 Tstack(騰訊云平臺)
- 8.3 K8s(微服務容器化)
- 九、運維編程技能
- 9.1 Shell(運維必會語言)
- 9.2 Python(萬能的膠水語言)
- 十、Devops運維
- 10.1 理念
- 10.2 Devops實戰