Mysql組複製之單主模式(一)

環境
系統:CentOS release 6.9 (Final)
Mysql:5.7
機器: S1 10.0.0.7 lemon
S2 10.0.0.8 lemon2
S3 10.0.0.9 lemon3
 
架構圖
 
 
1、安裝初始化數據庫
 
1)安裝相關依賴包
yum -y install gcc make cmake ncurses-devel libxml2-devel libtool-ltdl-devel gcc-c++ autoconf automake bison zlib-devel
 
2)安裝bootst庫
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
tar -zxvf boost_1_59_0.tar.gz
cd boost_1_59_0
./bootstrap.sh
./b2 stage threading=multi link=shared
./b2 install threading=multi link=shared
(threading=multi 表示使用多線程安裝 link=shared表示只安裝shared庫,忽略靜態庫的安裝)
 
3)下載編譯安裝Mysql
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
tar -zxvf mysql-5.7.17.tar.gz
cd mysql-5.7.17
cmake .
make && make install
 
4)建立數據目錄 並更改權限
mkdir /data/mysql
useradd mysql
 
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql
 
5)初始化數據庫的數據目錄(包含系統數據庫和相關表)
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --initialize
 
注:這裏的初始化有兩個參數可選,區別以下
--initialize 會生成一個隨機密碼
--initialize-insecure 不會生成一個隨機密碼 登陸的時候就不須要密碼
 
--initialize-insecure這個是不會生成隨機密碼的:(線上環境儘可能不要使用這種,使用了記得改密碼)
 
 
--initialize這個是會生成隨機密碼的:
 
 
2、配置組複製實例
 
1)修改配置文件 vim /usr/local/mysql/my.cnf
[mysqld]
#基本設置
user=mysql
datadir=/data/mysql
basedir=/usr/local/mysql
port=3306
socket=/usr/local/mysql/mysql.sock
pid-file=/usr/local/mysql/mysql.pid
log-error=/usr/local/mysql/error.log
 
#複製框架,根據Mysql組複製要求配置複製
 
#惟一標識號1
server_id=1
gtid_mode=ON #組複製使用全局事務標識符,來精確追蹤哪些事務已在全部server實例上提交,從而能判斷哪些server執行了與已提交事務衝突的事務
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksun=NONE
log_slave_updates=ON #server需記錄applier應用的二進制日誌
log_bin=binlog #MySQL組複製會複製二進制日誌的內容,所以需打開二進制日誌
binlog_format=ROW #組複製依賴於行的複製格式
 
#組複製設置
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.0.0.7:33061"
loose-group_replication_group_seeds="10.0.0.7:33061;10.0.0.8:33061;10.0.0.9:33061"
loose-group_replication_bootstrap_group=off
 
2)修改密碼
 
1)啓動mysql
nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf &
 
這裏啓動的時候看日誌肯能會有以下:這表示開始的時候尚未安裝group_replication插件,後面會安裝,因此能夠先不用管
 
 
 
2)把密碼給改了
 
sock連接到/tmp/mysql.sock;(當重啓mysql登錄不進的時候,能夠先把/tmp/mysql.sock刪除,再從新作連接)
ln -s /usr/local/mysql/mysql.sock /tmp/mysql.sock 
 
3)經過在日誌裏的臨時密碼登陸進去後,修改密碼,不修改密碼會報錯
 
 
set password=password('123456');

 
 
三、用戶憑證
 
建立具備REPLICATION-SLAVE權限的Mysql用戶,該操做不記錄到二進制日誌中,以免將更改傳遞到其餘的server實例。建立用戶:rpl_user,密碼rpl_pass
 
1)關閉二進制日誌,如下的操做不寫入二進制日誌
set sql_log_bin=0;

 

2)建立rpl_user用戶
create user rpl_user@'%';
@‘%’表示用戶能夠在哪一個主機上用此帳號登陸,%表示能夠從任何遠程主機登陸,若是隻容許從本機登陸,@‘localhost’
 
3)受權
grant replication slave on *.* to rpl_user@'%' identified by 'rpl_pass';
replication slave 表示對此操做受權
on *.* 表示授予該用戶對全部數據庫和表的相應操做權限
 
4) 刷新
flush privileges;
 
5)再打開二進制日誌
set sql_log_bin=1;

 
6)將server設置爲,在下次須要從其餘成員恢復狀態時,使用group_replication_recovery複製通道的給定憑證
change master to master_user='rpl_user',master_password='rpl_pass' for channel 'group_replication_recovery';

 

分佈式恢復是加入組的server執行的第一步,這句話的意思是說恢復是其餘待會兒加入這個組的服務的第一個步驟。若是未正確設置這些憑證,server將沒法執行恢復過程並得到與其餘組成員同步,所以最終沒法加入組。若是成員沒法經過server的主機名正確識別其餘成員,server將沒法執行恢復過程並得到與其餘組成員同步,則恢復過程可能會失敗。儘可能設置不同的主機名
 
use performance_schema
select *from replication_group_members;
 
四、啓動組複製
 
1)配置並啓動server s1 ,安裝組複製插件
 
install plugin group_replication soname 'group_replication.so';
 
2)檢查插件是否安裝成功
 
show plugins\G;

 
3)要啓動組,得指示server s1的引導組,而後啓動組複製程序
此引導組僅由單個server獨立完成,該server啓動組而且只啓動一次。引導配置選項的值不保存在配置文件中的緣由就是這個。若是將其保存在配置文件中,則在從新啓動時,server會自動引導具備相同名稱的第二個組,這將致使兩個不一樣的組具備相同的名稱。一樣的適用於中止和啓動插件。
 
啓動組複製:
global group_replication_bootstrap_group 爲引導變量,用於第一次啓動group_replicaiton時打開進行引導,啓動完group_replication後將其關閉,至關於第一個組成員啓動時,要對組進行初始化
 
啓動group_replication:
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=off;
 
 
4)此時能夠看到這個組已經建立而且已經有一個成員了
 
select *from replication_group_members;

 
 
5)作測試
 
建立一個test數據庫,而後在這個庫裏添加一張表,並插入值
create database test;
use test;
create table t1(
-> c1 int primary key,
-> c2 text not null
-> );
insert into t1 values (1,"lemon");

 
6)查看是否寫入二進制日誌
 
show binlog events ;

 
 
這樣只是默認查詢第一個二進制文件,這裏糾結了很久爲何會沒有數據,由於第5步建立的數據庫語句是放在另外一個binlog裏,因此查詢的時候得加文件名
 
show binlog events in 'binlog.000002';

 
 
五、向組類添加實例
 
1)添加第二個實例
 
10.0.0.8 lemon2
 
2)修改配置文件
 
[mysqld]
user=mysql
datadir=/data/mysql
basedir=/usr/local/mysql
port=3306
socket=/usr/local/mysql/s1.sock
pid-file=/usr/local/mysql/mysql.pid
log-error=/usr/local/mysql/error.log
 
server_id=2
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="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.0.0.8:33061"
loose-group_replication_group_seeds="10.0.0.7:33061,10.0.0.8:33061,10.0.0.9:33061"
loose-group_replication_bootstrap_group=off
 
與第一個server的區別是
server_id=2
oose-group_replication_local_address="10.0.0.8:33061",得改爲本機的IP和端口號
 
3)初始化數據目錄(與第一個server同樣)
4)啓動數據庫
5)修改密碼
6)添加用戶憑證
7)安裝組複製插件
8)將server 2 添加到組
這裏不須要再執行組的初始化(引導組),可是得執行下面這一句,若是不在會報錯:
 
重要:
set global group_replication_allow_local_disjoint_gtids_join=ON;
 
 
 
9)查看組內是否有兩個成員了
 
這裏有兩個成員了,可是剛剛加進來的這個是處於RECOVERY狀態,正常的是要ONLINE狀態
 
 
error.log日誌:
 
 
看這個報錯:就是說在server2上連server1的數據庫 以這種方式連rpl_user@lemon:3306 連不上
這個問題一看就知道,是由於server2並不知道主機名爲lemon是那臺機器,所以必須得添加主機名和IP
 
vim /etc/hosts
10.0.0.7 lemon
10.0.0.8 lemon2
10.0.0.9 lemon3
 
10)查看數據庫及表數據,看在server1建立的數據是否同步過來
 
 
server 2自動的鏈接到s1,並從其獲取丟失的數據
 
六、按照上述步驟添加第三個實例
 
 
 
到這裏爲止,單主模式下的組複製就已經完成了,這種搭建部署花時間就會,想要深刻理解原理,更好的使用這些技術,得要有場景,有環境,有機會去操做才行。永遠缺乏一個機會
 
3、模擬主機器掛了
 
模擬主機器掛了,會自動選取另外一臺主,能夠經過下面的命令查看哪一臺被升爲主了
 
select * from global_status where variable_name="group_replication_primary_member";

 

 
或者
 
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');

 

 
等原來的主恢復以後,不會自動的加入組,必須得手動打開組複製纔會加入
 
 
 
注:不能將自動啓動的配置加在配置文件裏,會報錯,並且不會自動加入組複製
 
四:將顯示出來的主機名變爲IP地址
 
 
 
在配置文件里加上:report_host=10.0.0.7,重啓後:
 
 
 
另外兩個也同樣
 
5、replication_group有關的信息
 
 
有關的幾張表:
 
1)replication_group_members
 
 
其中mermber_state的狀態有以下幾種:
ONLINE:表示正常
RECOVERING:該成員正在成爲該組的有效成員,而且正在恢復過程當中,從數據源節點接受狀態信息
OFFLINE:插件已加載,但成員不屬於任何組
ERROR:本地成員的狀態,恢復階段或應用更改時出現錯誤,server就會出現此狀態
UNREACHABLE:不可達
 
組複製不是同步複製,但最終是同步的。事物以相同的順序傳遞給全部組成員,但他們的執行不一樣步,也就是說在接受事務被提交以後,每一個成員以其本身的速度提交
 
2)replication_group_member_stats
 
 
CHANNEL_NAME: 組複製通道的名稱
MEMBER_ID: 該組成員的UUID
COUNT_TRANSACTIONS_IN_QUEUE: 隊列中等待衝突檢測檢查的事務數,檢查後,排隊等待應用
COUNT_TRANSACTIONS_CHECKED: 已進行過沖突檢查的事務數
COUNT_CONFLICTS_DETECTED: 表示未經過沖突檢查的事務數
COUNT_TRANSACTIONS_ROWS_VALIDATING: 衝突檢測數據庫的當前大小
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 已在當前視圖的全部成員上成功提交的事務
LAST_CONFLICT_FREE_TRANSACTION: 最後一個經檢查無衝突的事務標識符
 
3)replication_connection_status
 
 
4)replication_applier_status
 
 
REMAINING_DELAY: 是否配置了應用延遲
COUNT_TRANSACTIONS_RETRIES:應用事務的重試次數
 
6、如何作到MGR主節點故障自動切換
MGR單主模式下,當主節點故障,MGR內部將會發起一輪新的選舉,選出新的主,這是由MGR內部決定並執行的。可是當應用的鏈接遇到主節點掛掉的狀況下,是不會自動發生切換的,也就是說,MGR內部沒有提供一種機制,來實現主節點故障切換對應用無感知。
 
相關連接:
相關文章
相關標籤/搜索