一进副,前言
mysql 集群是mysqL官方自myql5.7以后推出來的完整的高可用性解決方案,集群是建立在mysql組復(fù)制技術(shù)上面的悔常,組復(fù)制是一種基于paxos
分布式一致性算法來實現(xiàn)數(shù)據(jù)的強一致性,也正因為是這種算法机打,才使得mysql集群能輕松的實現(xiàn)單點寫故障以及水平擴展讀能力,因此残邀,mysql
集群要求mysql實例至少需要3個皆辽,但是最多實例官方建議是9個,因為過多的實例會使得數(shù)據(jù)同步會增加網(wǎng)絡(luò)帶寬驱闷,從而降低數(shù)據(jù)同步的效率。
目前mysql組復(fù)制有兩種模式遗嗽,一種是single-primary(單主模式),一種是multiple-primaries(多主模式)痹换;在默認的單主模式下征字,
InnoDB集群只有一個讀-寫服務(wù)器實例——主實例娇豫。多個輔助服務(wù)器實例是主服務(wù)器的副本匙姜。如果主服務(wù)器失敗冯痢,則輔助服務(wù)器將自動提升
為主服務(wù)器角色。MySQL路由器檢測到這一點并將客戶端應(yīng)用程序轉(zhuǎn)發(fā)到新的主服務(wù)器浦楣。所以在接下來的配置中,本人將首先介紹組復(fù)制
的搭建振劳,只要組復(fù)制搭建成功椎组,mysql集群搭建將變得很簡單历恐。
二、mysql 組復(fù)制搭建,(多主模式弱贼、單主模式)
1蒸苇、首先準備三臺機器吮旅,IP地址分別是:192.168.0.112,192.168.0.113,192.168.0.130
2、安裝mysql鸟辅,本人使用的是5.7.23版本
2.1氛什、首先從官網(wǎng)下載文件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服務(wù)
2.5、登錄mysql后執(zhí)行 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密碼棍鳖。然后在執(zhí)行select uuid();會得到一個uuid字符串,這個一定要記住渡处,后面配置組復(fù)制用到。
3医瘫、配置組復(fù)制必要的啟動參數(shù):
編輯/etc/my.cnf文件,加入如下配置
transaction-isolation=READ-COMMITTED (官方建議用這種隔離級別)
server_id = 1123306 (保證組內(nèi)唯一)
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
loose-group_replication_single_primary_mode=off (單主模式不需要配置)
loose-group_replication_enforce_update_everywhere_checks=true (單主模式不需要配置)
配置完成后醇份,重啟mysql服務(wù)。service mysqld restart.
注:在這里有必要說明一下僚纷,所有組內(nèi)成員必須在/etc/hosts文件中配置ip 與 hostname的映射關(guān)系,因為組復(fù)制通訊是通過hostname來找到其他的成員機器怖竭,然后與之通訊的剩晴。
4侵状、安裝插件
install plugin group_replication soname 'group_replication.so';
5毅整、創(chuàng)建復(fù)制用戶趣兄,只需要在第一臺啟動集群的機器上創(chuàng)建就可以了悼嫉,后續(xù)加入集群的mysql服務(wù)會自動的通過這個賬號與組取得聯(lián)系艇潭,同時也會因為你在第一臺機器上面執(zhí)行過創(chuàng)建復(fù)制賬號留下的binlog日志戏蔑,
使得這個復(fù)制賬號同步到其他機器,這個過程可以通過在配置好重啟后執(zhí)行 show binlog events;查看到总棵。
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';(當然這個密碼太簡單了鳍寂,如果不在需要加入組的機器上面設(shè)置降低mysql的密碼安全策略等級情龄,會使賬號創(chuàng)建失敗捍壤,最后組復(fù)制搭建失敗)
6、給創(chuàng)建的用戶賦權(quán)
grant replication slave on *.* to 'repl'@'192.168.0.%' identified by '123456';
flush privileges;
7鞍爱、啟動首個節(jié)點的MGR集群服務(wù)
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery';
8、初始化操作(只有首個節(jié)點需要這個步驟)
set global group_replication_bootstrap_group=ON;
9睹逃、啟動組復(fù)制服務(wù)
start group_replication;
10、啟動成功后關(guān)閉初始化
set global group_replication_bootstrap_group=off;
11沉填、在剩下的機器中執(zhí)行以下操作
set global group_replication_allow_local_disjoint_gtids_join=ON;(這個參數(shù)主要是讓那些需要加入組的機器存在于組內(nèi)沖突的事務(wù)才執(zhí)行的,一般情況下不需要執(zhí)行這個命令拜轨,這個參數(shù)官方說后續(xù)會廢除掉)
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
12、當中不管是因為什么原因?qū)е陆M內(nèi)成員服務(wù)停止橄碾,重啟后都需要重啟進行集群初始化操作。
13法牲、注意點
13.1、參數(shù)loose-group_replication_group_name的值是通過select uuid()生成的拒垃,并且整個mgr集群中是唯一的停撞,所以其他組成員應(yīng)該將這個參數(shù)的值配置成跟第一臺啟動mgr集群的值一樣悼瓮。
13.2、如果在執(zhí)行START GROUP_REPLICATION;中出現(xiàn)"不能將當前實例加入到組中"的錯誤時横堡,這個時候需要發(fā)送semanage port -l | grep mysqld 命令來查看當前mysql允許使用哪些端口埋市,如果沒有你配置的端口命贴,
要么修改端口,要么用semanage port -a -t mysqld_port_t -p tcp [port] 來添加響應(yīng)的端口胸蛛,然后使用命令systemctl restart sshd.service重啟SELunix污茵。當然這是官網(wǎng)給出來的解決方案葬项,但是本人
用這個種方案來搭建發(fā)現(xiàn)只有第一個節(jié)點加入組會成功,剩下的節(jié)點加入組就會失敗了民珍,具體原因不是很清楚零蓉,所以本人建議關(guān)閉 SELinux
13.3、如何沒有semanage敌蜂,可以使用yum -y install policycoreutils-python來安裝。
14章喉、上述步驟執(zhí)行完成后,可以通過sql:select * from performance_schema.replication_group_members;來查看所有組內(nèi)成員是否都是ONLINE狀態(tài)秸脱。
單主模式下也可以直接執(zhí)行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');來查找那個才是主機器
好了摊唇,如果你的組復(fù)制搭建成功的話,那么在這一步將變的非常簡單巷查。
1有序、首先安裝 MySQL Shell 和 MySQL Router岛请,執(zhí)行如下兩條安裝命令
yum -y install mysql-shell
yum -y install mysql-router
2、執(zhí)行 mysqlsh 命令啟動mysql shell崇败,然后執(zhí)行 shell.connect('root@192.168.0.130:3306'),來連接組內(nèi)其中一臺mysql實例盅称,最好是連接組內(nèi)任意一臺secondary
3后室、執(zhí)行 var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});來創(chuàng)建集群實例。到此岸霹,集群搭建完成逞盆。
4松申、退出mysql shell俯逾,配置路由服務(wù)贸桶,執(zhí)行 mysqlrouter --bootstrap root@hostname/ip:3306 --user=root.這個時候回打印出連接路由服務(wù)的端口號
5桌肴、啟動路由服務(wù) mysqlrouter &來創(chuàng)建集群實例皇筛。
到目前為止水醋,mysql集群搭建已經(jīng)徹底完成,你可以用客戶端連接路由服務(wù)了拄踪,來開啟你的mysql集群之旅吧!;掏!
這些步驟都是通過官網(wǎng)的文檔來一步一步的搭建完成姚糊,如果有上面不妥之處,還請大家指出救恨。