一,前言
mysql 集羣是mysqL官方自myql5.7以後推出來的完整的高可用性解決方案,集羣是建立在mysql組複製技術上面的,組複製是一種基於paxos
分佈式一致性算法來實現數據的強一致性,也正因爲是這種算法,才使得mysql集羣能輕鬆的實現單點寫故障以及水平擴展讀能力,因此,mysql
集羣要求mysql實例至少需要3個,但是最多實例官方建議是9個,因爲過多的實例會使得數據同步會增加網絡帶寬,從而降低數據同步的效率。
目前mysql組複製有兩種模式,一種是single-primary(單主模式),一種是multiple-primaries(多主模式);在默認的單主模式下,
InnoDB集羣只有一個讀-寫服務器實例——主實例。多個輔助服務器實例是主服務器的副本。如果主服務器失敗,則輔助服務器將自動提升
爲主服務器角色。MySQL路由器檢測到這一點並將客戶端應用程序轉發到新的主服務器。所以在接下來的配置中,本人將首先介紹組複製
的搭建,只要組複製搭建成功,mysql集羣搭建將變得很簡單。
1、首先準備三臺機器,IP地址分別是:192.168.0.112,192.168.0.113,192.168.0.130
2、安裝mysql,本人使用的是5.7.23版本
2.1、首先從官網下載文件mysql57-community-release-el7-11.noarch.rpm
2.2、安裝rpm庫,使用命令 yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
2.3、安裝mysql實例,使用命令 yum -y install mysql-community-server
2.4、grep 'temporary password' /var/log/mysqld.log找到臨時root密碼,然後service mysqld start啓動mysql服務
2.5、登錄mysql後執行 set global validate_password_policy=0;set global validate_password_mixed_case_count=0;set global validate_password_number_count=3;set global validate_password_special_char_count=0;
set global validate_password_length=3;ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';修改root密碼。然後在執行select uuid();會得到一個uuid字符串,這個一定要記住,後面配置組複製用到。
3、配置組複製必要的啓動參數:
編輯/etc/my.cnf文件,加入如下配置
transaction-isolation=READ-COMMITTED (官方建議用這種隔離級別)
server_id = 1123306 (保證組內唯一)
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = '60d06502-add4-11e8-af31-000c29fc4619' (通過select uuid();得到的)
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.0.112:33061'
loose-group_replication_group_seeds ='192.168.0.112:33061,192.168.0.113:33062,192.168.0.130:33063'
loose-group_replication_bootstrap_group = off(這個參數必須在所有的mysql實例中設置成off)
loose-group_replication_single_primary_mode=off (單主模式不需要配置)
loose-group_replication_enforce_update_everywhere_checks=true (單主模式不需要配置)
配置完成後,重啓mysql服務。service mysqld restart.
注:在這裏有必要說明一下,所有組內成員必須在/etc/hosts文件中配置ip 與 hostname的映射關係,因爲組複製通訊是通過hostname來找到其他的成員機器,然後與之通訊的。
4、安裝插件
install plugin group_replication soname 'group_replication.so';
5、創建複製用戶,只需要在第一臺啓動集羣的機器上創建就可以了,後續加入集羣的mysql服務會自動的通過這個賬號與組取得聯繫,同時也會因爲你在第一臺機器上面執行過創建複製賬號留下的binlog日誌,
使得這個複製賬號同步到其他機器,這個過程可以通過在配置好重啓後執行 show binlog events;查看到。
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';(當然這個密碼太簡單了,如果不在需要加入組的機器上面設置降低mysql的密碼安全策略等級,會使賬號創建失敗,最後組複製搭建失敗)
6、給創建的用戶賦權
grant replication slave on *.* to 'repl'@'192.168.0.%' identified by '123456';
flush privileges;
7、啓動首個節點的MGR集羣服務
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery';
8、初始化操作(只有首個節點需要這個步驟)
set global group_replication_bootstrap_group=ON;
9、啓動組複製服務
start group_replication;
10、啓動成功後關閉初始化
set global group_replication_bootstrap_group=off;
11、在剩下的機器中執行以下操作
set global group_replication_allow_local_disjoint_gtids_join=ON;(這個參數主要是讓那些需要加入組的機器存在於組內衝突的事務才執行的,一般情況下不需要執行這個命令,這個參數官方說後續會廢除掉)
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
12、當中不管是因爲什麼原因導致組內成員服務停止,重啓後都需要重啓進行集羣初始化操作。
13、注意點
13.1、參數loose-group_replication_group_name的值是通過select uuid()生成的,並且整個mgr集羣中是唯一的,所以其他組成員應該將這個參數的值配置成跟第一臺啓動mgr集羣的值一樣。
13.2、如果在執行START GROUP_REPLICATION;中出現"不能將當前實例加入到組中"的錯誤時,這個時候需要發送semanage port -l | grep mysqld 命令來查看當前mysql允許使用哪些端口,如果沒有你配置的端口,
要麼修改端口,要麼用semanage port -a -t mysqld_port_t -p tcp [port] 來添加響應的端口,然後使用命令systemctl restart sshd.service重啓SELunix。當然這是官網給出來的解決方案,但是本人
用這個種方案來搭建發現只有第一個節點加入組會成功,剩下的節點加入組就會失敗了,具體原因不是很清楚,所以本人建議關閉 SELinux
13.3、如何沒有semanage,可以使用yum -y install policycoreutils-python來安裝。
13.4、SHOW BINLOG EVENTS;這個命令可以查看到當前組複製同步數據的binlog日誌,如果你想重新搭建,又不想卸載mysql實例,請先執行reset master; 用來重置所有的binlog,這樣重新搭建財貨成功。
14、上述步驟執行完成後,可以通過sql:select * from performance_schema.replication_group_members;來查看所有組內成員是否都是ONLINE狀態。
單主模式下也可以直接執行sql:SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');來查找那個纔是主機器
好了,如果你的組複製搭建成功的話,那麼在這一步將變的非常簡單。
1、首先安裝 MySQL Shell 和 MySQL Router,執行如下兩條安裝命令
yum -y install mysql-shell
yum -y install mysql-router
2、執行 mysqlsh 命令啓動mysql shell,然後執行 shell.connect('[email protected]:3306'),來連接組內其中一臺mysql實例,最好是連接組內任意一臺secondary
3、執行 var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});來創建集羣實例。到此,集羣搭建完成。
4、退出mysql shell,配置路由服務,執行 mysqlrouter --bootstrap root@hostname/ip:3306 --user=root.這個時候回打印出連接路由服務的端口號
5、啓動路由服務 mysqlrouter &來創建集羣實例。
到目前爲止,mysql集羣搭建已經徹底完成,你可以用客戶端連接路由服務了,來開啓你的mysql集羣之旅吧!!!
這些步驟都是通過官網的文檔來一步一步的搭建完成,如果有上面不妥之處,還請大家指出。