myslq實現讀寫分離(主從複製)

目錄

主從配置注意事項(前提)

主庫需要配置:(my.conf)

在主庫創建同步用戶

從庫配置(my.conf)

用docker創建從庫

主從複製模式

查看主從複製是否是混合模式

查看是否成功:執行命令後查看紅線劃定是否是yes,yes代表成功,否則失敗

mycat配置:server.xml:

 schema.xml:


  • 主從配置注意事項(前提)

  1. 主DB server和從DB server數據庫的版本一致
  2. 主DB server和從DB server數據庫數據一致
  3. 主DB server開啓二進制日誌,主DB server和從DB server的server_id都必須唯一

主庫需要配置:(my.conf)

在[mysqld]片段中添加
#開啓主從複製,主庫的配置
log-bin = mysql-bin


#指定主庫serverid
server-id=1 
#指定同步的數據庫,如果不指定則同步全部數據庫
 binlog-do-db=my_test
#執行SQL語句查詢狀態
 SHOW MASTER STATUS


#修改主庫的配置主從複製爲混合模式 
binlog_format=MIXED


#重啓
docker restart percona-master01 && docker logs -f percona-master01

在主庫創建同步用戶

#創建用戶
create user 'slave01'@'%' identified by '123456';

#如果出現 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and,可以在my.cnf配置文件中設置 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

#授權用戶slave01使用123456密碼登錄mysql
grant replication slave on *.* to 'slave01'@'127.0.0.1' identified by '123456'; 

如果不需要限制ip可以執行
grant replication slave on *.* to 'slave01'@'%' ; 
#刷新配置
flush privileges;

從庫配置(my.conf)

#指定serverid,只要不重複即可,從庫也只有這一個配置,其他都在SQL語句中操作 
server-id=2


#執行以下SQL: 
CHANGE MASTER TO
 master_host='127.0.0.1',
 master_user='slave01',
 master_password='123456',
 master_port=3306,
#下面的信息通過在主庫中執行  
#SHOW MASTER STATUS命令來查看
 master_log_file='mysql-bin.000006',
 master_log_pos=1120;




#啓動slave同步 
START SLAVE;
#查看同步狀態
SHOW SLAVE STATUS;

#查看二進制日誌相關的配置項
show global variables like 'binlog%';
#查看server相關的配置項
show global variables like 'server%';

 

 


用docker創建從庫

#創建目錄
mkdir /data/mysql/slave01 cd /data/mysql/slave01 mkdir conf data
chmod 777 * -R
#創建配置文件
cd /data/mysql/slave01/conf vim my.cnf
#輸入如下內容
[mysqld]
server-id=2 #服務id,不可重複

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#創建容器
docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#啓動
docker start percona-slave01 && docker logs -f percona-slave01
#設置master相關信息 CHANGE MASTER TO
 master_host='192.168.1.18',
 master_user='dbtest',
 master_password='dbtest',
 master_port=3306,
 master_log_file='mysql-bin.000002',
 master_log_pos=648;
#啓動同步 start slave;
#查看master狀態 show slave status;

主從複製模式

 在查看二進制日誌相關參數內容中,會發現默認的模式爲ROW,其實在MySQL中提供了有3種模式,基於SQL語句的 複製(statement-based replication, SBR),基於行的複製(row-based replication, RBR),混合模式複製(mixed- based replication, MBR)。對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED。
STATEMENT模式(SBR) 每一條會修改數據的sql語句會記錄到binlog中。
優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日誌量,節約IO,提高性能。 缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)
ROW模式(RBR)
不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了。而且不會出現某些特定情況下的 存儲過程、或function、或trigger的調用和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是alter table的時候會讓日誌暴漲。
MIXED模式(MBR) 以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog,對於STATEMENT模式無法複製的操作使用
ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。 建議使用MIXED模式。(在上面的配置中已採用此種模式)

查看主從複製是否是混合模式

#查看二進制日誌相關的配置項
show global variables like 'binlog%';

 

查看是否成功:執行命令後查看紅線劃定是否是yes,yes代表成功,否則失敗


mycat配置:server.xml:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>
        <property name="useGlobleTableCheck">0</property>
        <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property>
        <property name="processorBufferPoolType">0</property>
        <property name="handleDistributedTransactions">0</property>
        <property name="useOffHeapForMerge">1</property>
        <property name="memoryPageSize">64k</property>
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <property name="systemReserveMemorySize">384m</property>
        <property name="useZKSwitch">false</property>
</system>
<!--這裏是設置的dbtest用戶和虛擬邏輯庫-->
<user name="dbtest" defaultAccount="true">
        <property name="password">dbtest123</property>
        <property name="schemas">dbtest</property>
    </user>
</mycat:server>

 schema.xml:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<!--配置數據表-->
<schema name="dbtest" checkSQLschema="false" sqlMaxLimit="100">
        <table name="tb_ad" dataNode="dn1" rule="mod-long" />
    </schema>
<!--配置分片關係-->
<dataNode name="dn1" dataHost="cluster1" database="dbtest" /> <!--配置連接信息-->
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3"
                writeType="1" dbType="mysql" dbDriver="native" switchType="1"
                slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="W1" url="192.168.1.18:3306" user="root"
                     password="root">
            <readHost host="W1R1" url="192.168.1.18:3307" user="root"
        </writeHost>
    </dataHost>
</mycat:schema>

balance屬性說明: 負載均衡類型,目前的取值有3 種:
1. balance="0", 不開啓讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上。
2. balance="1",全部的readHost 與stand by writeHost 參與select 語句的負載均衡,簡單的說,當雙 主 雙從模式(M1->S1,M2->S2,並且M1 與M2 互爲主備),正常情況下,M2,S1,S2 都參與select 語句的負
載均衡。
3. balance="2",所有讀操作都隨機的在writeHost、readhost 上分發。
4. balance="3",所有讀請求隨機的分發到wiriterHost 對應的readhost 執行,writerHost 不負擔讀壓 力,
注意balance=3 只在1.4 及其以後版本有,1.3 沒有。

紅色字體是需要改的

 

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