MySQL主從複製

簡介:

   MySQL主從複製也稱主從同步,他是構建數據庫高可用集羣架構的基礎,將一臺主機的數據複製到多臺主機,並從新應用日誌中的SQL語句實現複製功能mysql

MySQL支持單向,雙向,鏈式級聯,異步複製linux

5.5版本新增半同步複製  5.6新增GTID複製  5.7新增多源複製/並行複製/loss-less複製,複製過程當中,一臺服務器充當主庫,另外一個充當從庫sql

常見主從模式:

1)   master------------->slave    單向主從數據庫

2)   master <-----------> master  雙向主從服務器

3)  master -------->slave1------>slave2  級聯主從網絡

4)  master ------->slave    一主多從session

       |--------------->slave2架構

5)master------------>slave   多主一從less

     master--------------|^異步

主從複製原理:

主庫 :I/O-dump-thread

從庫:I/O-thread  SQL-thread

從庫的I/O-thread向主庫請求binlog文件,主庫I/O-dump-thread響應寫入從庫的relaylog文件

從庫的SQL-thread從relaylog文件中讀取語句,轉成SQL語句,寫入從庫

主從複製的重點參數

log-bin 搭建主從複製,必須開啓二進制日誌

server-id :主從服務器的標識,主從服務器不能一致

server-uuid :  mysql5.6 新增  ,數據庫啓動自動生成,保存在數據目錄下的auto.cnf中

read_only: 設置從庫爲只讀狀態      super_read_only: 全部帳號包括管理員都會禁止寫

binlog_format:   必須爲row

log_slave_updates:  獲取主服務器上的數據變動信息,寫到從服務器的二進制日誌中

binlog_error_action:  5.7新增    =ABORT_SERVER  不能寫binlog時,mysql會退出(默認)

                =IGNORE_ERROR 不能寫入binlog時,關閉binlog功能,會致使主從出現數據庫數據不一致的狀況

binlog-do-db:  (主庫) 選擇複製哪一個數據庫

binlog-ignore-db:  不復制哪一個數據庫

gtid_mode:決定是否開啓gtid模式

enforce-gtid-consistency: 開啓gtid模式,該參數也開啓

gtid_next:  session級別的變量,下一個gtid,默認automatic

gtid_purged:丟掉的gtid

relay_log:記錄從庫的IO thread從主庫讀取來的binlog

replicate_do_table:(從庫) 複製指定表

replicate_ignore_table:(從庫) 不復制指定表

replicate_do_db:(從庫)只複製指定庫

replicate_ignore_db:(從庫) 不復制指定庫

replicate-wild-do-table:使用通配符複製指定表

replicate-wild-ignore-table:使用通配符不復制指定表

master-info-repository:=table  記錄主從狀態&配置

relay_log_info_repository:=table  記錄斌binlog應用位置記錄到relay.info中

relay_log_recovery:(從庫)(默認關閉)(建議開啓=1)

relay_log_purge:(從庫)(建議開啓)清除已執行的relaylog

slave_net_timeout :設置網絡超時時間點

並行複製參數:

slave_parallel_type='LOGICAL_CLOCK'

slave_parallel_workers = X  設置X線程執行relaylog中向主庫提交的事務

部署:

主MySQL部署

1)安裝MySQL 

MYSQL_TAR=mysql tar包

 

tar zxvf $MYSQL_TAR -C /opt/
MYSQL=`echo $MYSQL_TAR | sed -r "s/.tar[.a-zA-Z0-9]+//g"`
mv /opt/${MYSQL} /opt/mysql
ln -s /opt/mysql /usr/local/mysql
mkdir -p /opt/mysql/data
groupadd mysql
useradd -r -g mysql mysql
rpm -qa | grep libaio > /dev/null

2)修改 /etc/my.cnf

cat  > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF

3)環境修改

chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /opt/mysql
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod 777 /etc/init.d/mysql
echo "export PATH=$PATH:/opt/mysql/bin" >> /etc/profile
source /etc/profile

4)重設密碼

service mysql stop 2>&1 > /dev/null
/opt/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables  > /opt/log &
sleep 3s
/opt/mysql/bin/mysql -u root << EOF
use mysql;
update user set  authentication_string=password('123456') where user='root';
update user set password_expired='N' where user='root';
flush privileges;
EOF
#service mysql stop
pgrep mysqld | xargs kill -9

5)主修改

cat > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
server_id=101
log_bin=/usr/local/mysql/mysql-bin
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF

6)自動登錄設置&建立同步用戶

service mysql stop
echo '[client]' >> /etc/my.cnf
echo 'host=localhost' >> /etc/my.cnf
echo "user=$MASTER_mysql_user" >> /etc/my.cnf
echo "password=$MASTER_mysql_pass" >> /etc/my.cnf
service mysql start
sleep 10s
mysql  << EOF
grant replication slave ,replication client on *.* to user@'%' identified by '123456';
flush privileges;
EOF

7)防火牆設置

MySQL的PORT=3306

iptables -A INPUT -p tcp --dport $PORT -j ACCEPT
iptables -A OUTPUT -p tcp --dport $PORT -j ACCEPT
################setenforce
setsebool -P mysql_connect_any on
setsebool -P selinuxuser_mysql_connect_enabled on

8)檢查主狀態 

mysql <<EOF > conf_master
show master status;
EOF

從MySQL部署

1)MySQL安裝

同上

2)從 /etc/my.cnf修改

cat > /etc/my.cnf << EOF
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
server_id=102
log_bin=/usr/local/mysql/mysql-bin.log
relay-log=/usr/local/mysql/mysql-relay-bin.log
#read_only=1
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql_error
pid-file=/usr/local/mysql/data/`hostname`.pid
!includedir /etc/my.cnf.d
EOF

3)修改環境

同上

4)修改MySQL密碼

同上

5)設置自動登錄

同上

6)防火牆設置

同上

7)從MySQL設置

MASTER_LOG=`cat /opt/conf_master | grep mysql | cut -d ' ' -f1`
MASTER_POS=`cat /opt/conf_master | grep mysql | cut -d ' ' -f2`

conf_master 是主MySQL檢查狀態傳過來的文件

 

mysql << EOF
change master to master_host='$MASTER_IP',master_user='user',master_password='123456',master_log_file='${MASTER_LOG}',master_log_pos=${MASTER_POS};
flush privileges;
start slave;
EOF

8)檢查從MySQL狀態

mysql <<EOF > conf_slaveshow slave status\G;EOF

相關文章
相關標籤/搜索