mysql讀寫分離

mysql:

大規模,高併發web服務器體系結構

mysql複製,nginx,lnmp,memcached,tomcat(java,servlet,集羣),varnish

nosql(redis,mongodb)

二進制日誌
事物日誌
錯誤日誌
一般查詢日誌
中繼日誌
慢查詢日誌

二進制日誌:
數據目錄
mysql-bin.xxxxxx
滾動:達到最大上限,flush logs,服務器重啓
mysql>purge

二進制日誌的格式:
    statement
    row
    mixed

mysql-bin.index:二進制日誌文件索引文件

mysql>show master status;
mysql>show binary logs;
mysql>show binlog events in "flie";

event:
     timestamp
      position,offset,server-id

即時點還原:
mysql:tx1

mysql隔離級別:
READ-UNCMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE

mysql replication

relay log:中繼日誌

多級複製

複製的作用:
輔助實現備份
高可用
異地容災
scale out:分攤負載

rw-spliting:讀寫分離

主從架構中,不使用mysql代理,如何讓主的負責寫,從的負責讀?

雙主:無法減輕寫操作

雙主模型:
tutors:name,age,gender,tid

Tom 10
Jerry 30

A:update tutors set name=Jerry where age=10;
B:update tutors set age=30 where name=Tom;

scale out
分庫,垂直拆分,水平分割

scale on

讀寫分離:
mysql-proxy
amoeba

數據拆分:
cobar

master:slave
slave:master

一個從只能屬於一個主服務器
MySQL 5.5:gtid,multi-thread replication

配置MySQL複製基本步驟:

一、master

1.啓用二進制日誌
log-bin = master-bin
log-bin-index = master-bin.index

2.選擇一個惟一server-id
server-id = {0-2^32}

3.創建具有複製權限的用戶
REPLICATION SLAVE
REPLICATION CLIENT

二、slave

1.啓用中繼日誌
relay-log = relay-log
relay-log-index =

2.選擇一個惟一的server-id
server-id = {0-2^32}

3.連接至主服務器,並開始複製數據
mysql>CHANGER MASTER TO MASTER_HOST='',MASTER_PORT='',MASTER_LOG_PORT='',MASTER_LOG_FILE='',MASTER_LOG_FIEL_POS='',MASTER_USER='',MASTER_PASSWORD='';

mysql> start slave;

mysql>start slave IO_Thread;
mysql>start SLAVE SQL_Thread

複製線程:
master:dump
slave:IO_thread,SQL_thread

node1(master):

mkdir -pv /mydata/data

useradd -r mysql
chown -R mysql.mysql /mydata/data/

tar -zxvf mysql-5.5.28 -C /usr/local
ln -sv mysql-5.5.28-linux2.6-i686 mysql
cd /usr/local/mysql
chown -R root.mysql ./
script/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld

vim /etc/my.cnf
[mysqld]
log-bin = master-bin
log-bin-index=master-bin.index
innodb_file_per_table = 1
datadir = /mydata/data
server-id = 1

service mysqld start

vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile.d/mysql.sh

mysql>grant replication slave on . to 'repluser'@'172.16.%.%' identified by 'replpass';
mysql>flush privileges;
mysql>show master status;
mysql>show binlog event in 'master-bin.000001';

scp /etc/my.cnf node2:/etc/my.cnf

node2(slave):
mkdir /mydata/data
useradd -r mysql
chown -R mysql.mysql /mydata/data
tar -zxvf mysql-5.8.28 -C /usr/local
ln -sv mysql-5.5.28-linux2.6 mysql
cd /usr/local/mysql
chown -R root:mysql ./
script/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/mysql.server /etc/init.d/mysqld

vim /etc/my.cnf
log-bin=master-bin(註釋掉)
log-bin-index=master-bin.index(註釋掉)
relay-log=relay-log
relay-log-index=relay-log.index
server-id = 11

service mysqld start

vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile.d/mysql.sh

mysql>change master to master_host='172.16.100.6',master_user='repluser',master_log_file='master-bin.00001',master_log_pos=339;
mysql>show slave status;
mysql>start slave;
mysql>show global variables like 'read%';

vim /etc/my.cnf
read-only=on

service mysqld restart

mysql> show global variables like 'read-only';

cd /mydata/data
cat master.info
cat relay-log.info

read-only=yes:在從服務器上設定,但對具有super權限的用戶不生效

mysql>show global variables like '%log%';

sync-binlog=on:在主服務器上設定,用於事務安全;

mysql>show global variables like '%slave';
mysql>stop slave;
mysql>show slave status\G;
mysql>start slave io_thread;
mysql>start slave sql_thread;

半同步複製:
cd /usr/local/mysql/plugin

node1(master)
mysql>install plugin rpl_semi_sync_master soname 'semisync_mater.so';
mysql>show global variables like '%rpl%';
mysql>set global rpl_semi_sync_master_enabled=1;
mysql>show master status;

node2(slave)
mysql>install plugun rpl_semi_sync_slave soname 'semisync_slave.so';
mysql>set global rpl_semi_sync_slave_enable=l;
mysql>stop slave IO_THREAD;
mysql>start slave IO_THREAD;
mysql>show slave status;

另一個管理工具:
percona:percona-tools
mattki-tools

yum localinstall percona-toolkit

pt-slave-delay

主主複製:
見另外文檔

mysql>show global variables like '%ssl%';

只複製指定的庫或表(複製過濾):
MySQL:

mysql>show global variables like 'binlog-%';

master:

binlog-do-db:僅將指定數據庫的相關修改操作記入二進制日誌
binlog-ignore-db:

mysql>create database db1;
mysql>create databse discuz;

slave:

replicate-do-db=
repicate-ignore-db=
replicate-do-table=
replicate-ignore-table=
relicate-wild-do-table=
replicate-wild-ignore-table=

vim /etc/my.cnf
replicate-do-db=discuz(這是一個你要複製的數據庫名稱)

每個數據庫僅能使用一個線程
複製涉及到多個數據庫時多線程複製纔有意義

MySQL-5.6:GTID
slave-parallel-workers=0
0:表示禁用多線程工具

mysql>show slave hosts;

配置基於gtid及多線程複製:(見配置文檔)
master:
[mysqld]
binlog-format=row
log-bin=master-bin
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
matser-info-repository=table
relay-log-info-repository=table
sync-master-info=1
slave-parallel-works=2
binlog-checksum=crc32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=1
report-port=3306
port=3306
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=172.16.100.107

slave:
[mysqld]
binlog-format=ROW
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=11
report-port=3306
port=3306
log-bin=mysql-bin.log
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=172.16.100.7

master:
mkdir /mydata/data
useradd -r mysql
chown -R mysql.mysql /mydata/data
tar -zxvf mysql-5.6.10 -C /usr/local
cd /mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data

vim /etc/my.cnf(見配置文檔)
datadir=/mydata/data
innodb_file_per_table=on

server-id=1
socket=/tmp/mysql.sock
log-bin=master-bin
.........

vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/sbin

mysql>show global variables like '%gtid%';
mysql>show master status;
mysql>show global variables like '%uuid%';
mysql>grant replication slave on . to 'repluser'@'172.16.%.%' identified by 'repluser'
mysql>flush privileges;
mysql>create database mydb;
mysql>show slave hosts;
mysql>show global variables like '%gtid%';
mysql>select @@autocommit;
mysql>use mydb;
mysql>create table mytable(id int(10),name char(10));

slave:
mkdir /mydata/data
useradd -r mysql
chown -R mysql.mysql /mydata/data
tar -zxvf mysql-5.6.10 -C /usr/local
cd /mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data

vim /etc/my.cnf(見配置文檔)
[mysqld]
datadir=/mydata/data

server-id=11
socket=/tmp/mysql.sock
log-bin=master-bin
.........

vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/sbin

cp support-files/mysql.server /etc/init.d/mysqld

service mysqld start

mysql>show global variables like '%uuid%';
mysql>change master to master_host='172.16.100.106',master_user='repluser',master_password='replpass',master_auto_position=1;
mysql>show slave status;
mysql>start slave;
mysql>show databases;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章