一、介紹
傳統架構的使用,一直被人們所詬病,因為MySQL的主從模式,天生的不能完全保證數據一致,很多大公司會花很大人力物力去解決這個問題,而效果卻一般,可以說,只能是通過犧牲性能,來獲得數據一致性,但也只是在降低數據不一致性的可能性而已。所以現在就急需一種新型架構,從根本上解決這樣的問題,天生的擺脫掉主從復制模式這樣的“美中不足”之處了。
Galera Cluster :集成了Galera插件的MySQL集群,是一種新型的,數據不共享的,高度冗余的高可用方案,多節點都可以作為主節點,節點是對等的,當有客戶端要寫入或者讀取數據時,隨便連接哪個實例都是一樣的,讀到的數據是相同的,寫入某一個節點之后,集群自己會將新數據同步到其它節點上面,這種架構不共享任何數據,是一種高冗余架構。相比傳統架構,Galera Cluster解決的最核心問題是,在三個實例(節點)之間,它們的關系是對等的,multi-master架構的,在多節點同時寫入的時候,能夠保證整個集群數據的一致性,完整性與正確性。
本博客的部署始於本人openstack中 mysql 多主集群部署的一個小功能。第一次接觸,記錄下自己的心路歷程。排除了很多坑點,記錄下應該注意到的細節。
二、環境介紹
1、系統:
CentOS Linux release 7.4.1708 (Core)
2、節點(3台):
openstack1:10.6.32.51
openstack2:10.6.32.52
openstack3:10.6.32.53
3、關閉 firewall 、selinux
4、設置時間同步:chrony
5、部署工具安裝(可選):
# yum -y install bash-completion.noarch bash-completion-extras.noarch vim net-tools
6、查看和卸載 系統原有的 mariadb、mysql (必須卸載,否則后期會有問題):
# rpm -qa | grep maria
# rpm -qa | grep mysql
# yum remove mariiadb
# yum remove mysql
7、更新 epel 源
# yum -y install epel-release
三、mysql 5.7 Galera Cluster 部署
1、下載 集成 galera 的mysql rpm包(所有節點)
cd /usr/local/src wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-client-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-common-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-devel-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-libs-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-libs-compat-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-server-5.7-5.7.21-25.14.el7.x86_64.rpm wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-test-5.7-5.7.21-25.14.el7.x86_64.rpm
2、安裝mysql、galera(所有節點)
# yum -y install ./mysql*.rpm
# yum -y install galera
3、數據庫啟動 (openstack1上操作)
# systemctl start mysqld
# systemctl enable mysqld
4、添加Galera Cluster 數據同步用戶(openstack1上操作)
a、mysql 5.7 默認有密碼,密碼查看方式:
# more /var/log/mysqld.log | grep password
A temporary password is generated for root@localhost:kqi6>roGB.lF 默認隨機密碼
b、修改mysql root 密碼及添加 數據同步用戶galera:
# mysql -uroot -p kqi6>roGB.lF
# SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
# GRANT ALL ON *.* TO 'galera'@'localhost' IDENTIFIED BY 'youpasswd'; (添加用戶:galera,后期集群配置文件用到 )
c、停止數據庫,開始配置同步集群文件。
# systemctl stop mysqld
5、配合集群文件(所有節點上操作)
# vim /etc/my.cnf
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid log_timestamps = SYSTEM #設置數據庫日志時間為系統時間
server-id=101 #集群節點ID,集群內唯一ID。 wsrep_cluster_name=openstack_cluster wsrep-provider=/usr/lib64/galera/libgalera_smm.so #查看實際安裝路徑 wsrep_node_name = openstack_db01 #集群節點名稱 wsrep_cluster_address=gcomm://10.6.32.51,10.6.32.52,10.6.32.53 wsrep_node_address=10.6.32.51 wsrep_provider_options =gmcast.listen_addr=tcp://10.6.32.51:4567 wsrep_sst_donor=openstack_db01,openstack_db02,openstack_db03 wsrep_sst_method=xtrabackup-v2 #集群數據同步方式( xtrabackup-v2或rsync 都需要安裝所匹配的插件) wsrep_sst_auth=galera:youpasswd # 之前添加的數據同步用戶 slow_query_log=on max_allowed_packet = 1M table_open_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K net_buffer_length = 2K read_buffer_size = 256K net_buffer_length = 2K thread_stack = 256K max_connections = 2000 #數據庫最大連接數
#openstack2 不同之處:
# vim /etc/mycnf
server-id=102 wsrep_node_name = openstack_db02 wsrep_node_address=10.6.32.52 wsrep_provider_options =gmcast.listen_addr=tcp://10.6.32.52:4567
#openstack3 不同之處:
# vim /etc/mycnf
server-id=103 wsrep_node_name = openstack_db03 wsrep_node_address=10.6.32.53 wsrep_provider_options =gmcast.listen_addr=tcp://10.6.32.53:4567
6、安裝數據同步插件,本博客使用的是: xtrabackup-v2(注意:xtrabackup 2.3的版本不支持,mysql 5.7 需要安裝 xtrabackup 2.4)(所有節點上操作)
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# yum search xtrabackup
# yum -y install percona-xtrabackup-24.x86_64 (mysql 5.7 一定要安裝 percona-xtrabackup-24.x86_64,否則后續的報錯會讓你懷疑人生。)
7、集群啟動
a、當集群中還沒有節點啟動時,確認所有節點上沒有mysql進程,如果有請關閉。(所有節點操作)
# ps -aux | grep mysql
# kill -9 mysql-id
b、啟動集群中第一個節點。(openstack1 上操作)
# /usr/sbin/mysqld --wsrep-new-cluster --user=root & (當且僅當 集群中沒有任何節點開啟,啟動第一個節點時使用)
c、啟動其他節點,逐台啟動,然后查看集群狀態
# systemctl start mysqld (集群中有節點后就可以正常啟動。openstack2 和openstack3 上依次啟動,啟動一台查看依次集群狀態)
集群狀態查看,數據庫中查看:
mysql> show status like 'wsrep_%';
我們可以關注幾個關鍵的參數:
wsrep_connected = on鏈接已開啟
wsrep_local_index = 1在集群中的索引值
wsrep_cluster_size =3集群中節點的數量 (每啟動一台,如果加入到集群中,size 會+1)
wsrep_incoming_addresses =10.6.32.51:3306,10.6.32.53:3306,10.6.32.52:3306集群中節點的訪問地址
d、重新啟動第一個節點的數據庫(opoenstsck1上操作)
# kill -i mysq-id (因為第一次為非正常啟動,需要使用kill 殺掉進程來關閉mysql)
# systemctl restart mysqld
(如果重啟失敗,請查看/var/lib/mysql/mysql.sock.lock 是否存在,如果存在,刪除后重新啟動。)
e、在各節點使用 數據同步用戶galera登錄,如果可以正常啟動並登錄成功。到此,Galera Cluster 已經成功部署。
四、測試
1、在openstck1 節點上創建測試數據庫test,其他節點查看是否可以看到測試庫。
mysql> create database test;
2、其他節點查看:
數據庫實時自動同步,再次證明 Galera Cluster 集群部署成功。
3、附加,查看數據庫最大連接數
mysql> show variables like '%max_connections%';
如期,已經修改為2000,數據庫最大連接太小,后期openstack 會報錯:數據庫連接數太小。
謝謝~~~