溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Docker容器如何實現(xiàn)MySQL多源復制

發(fā)布時間:2022-06-14 09:28:56 來源:億速云 閱讀:162 作者:zzz 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Docker容器如何實現(xiàn)MySQL多源復制的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    ?? 1.多源復制簡介

    在 MySQL 8.0 版本中,提供了多源復制,多源復制的出現(xiàn)對于分庫分表的業(yè)務(wù)提供了極大的便利,目前我們已經(jīng)部署了多套多源復制供統(tǒng)計使用。MySQL 5.7 之前只能實現(xiàn)一主一從、一主多從或者多主多從的復制。如果想實現(xiàn)多主一從的復制,只能使用 MariaDB,但是 MariaDB 又與官方的MySQL 版本不兼容。
    MySQL 5.7 開始支持了多主一從的復制方式,也就是多源復制。MySQL 8.0 版本相比之前的版本,無論在功能還是性能、安全等方面都已經(jīng)有不少的提升。
    拓展:MySQL之父Widenius先生離開了Sun之后,覺得依靠Sun/Oracle來發(fā)展MySQL,實在很不靠譜,于是決定另開分支,這個分支的名字叫做MariaDB。

    多源復制的好處:

    可以集中備份,在從庫上備份,不會影響線上的數(shù)據(jù)正常運行
    節(jié)約購買從庫服務(wù)器的成本,只需要一個從庫服務(wù)器即可
    數(shù)據(jù)匯總在一起,方便后期做數(shù)據(jù)統(tǒng)計
    減輕DBA維護工作量。

    ?? 2.多源復制使用場景

    Backing up multiple servers to a single server.
    Merging table shards.
    Consolidating data from multiple servers to a single server.

    Docker容器如何實現(xiàn)MySQL多源復制

    如上圖,多源復制采用多通道的模式,和普通的復制相比,就是使用 FOR CHANNEL進行了分離。
    CHANGE MASTERTO…FORCHANNEL’m1’;
    CHANGE MASTERTO…FORCHANNEL’m2’;
    要開啟多源復制功能必須需要在從庫上設(shè)置 master-info-repository 和 relay-log-info-repository 這兩個參數(shù)。
    這兩個參數(shù)是用來存儲同步信息的,可以設(shè)置的值為 FILE 和 TABLE,5.7默認值是 FILE。
    比如 master-info 就保存在 master.info 文件中,
    relay-log-info 保存在 relay-log.info 文件中,
    如果服務(wù)器意外關(guān)閉,正確的 relay-log-info 沒有來得及更新到 relay-log.info 文件,這樣會造成數(shù)據(jù)丟失。
    為了數(shù)據(jù)更加安全,通常設(shè)為 TABLE。這些表都是 innodb 類型的,支持事務(wù)。
    相對文件存儲安全得多。在 MySQL 庫下可以看見這兩個表信息,分別是 mysql.slave_master_info 和 mysql.slave_relay_log_info。
    這兩個參數(shù)也是可以動態(tài)調(diào)整的。
    SET GLOBAL master_info_repository=‘TABLE’;
    SET GLOBAL relay_log_info_repository=‘TABLE’;

    ?? 3.多源復制部署

    搭建過程支持GTID復制模式和binlog+position方式復制。

    Docker容器如何實現(xiàn)MySQL多源復制

    ? 3.1 下載鏡像

    docker pull mysql:8.0.27
    –docker network create --subnet=172.72.0.0/24 mysql-network
    docker rm -f mysql8027M33265 mysql8027M33266 mysql8027M33267 mysql8027M33268

    ? 3.2 創(chuàng)建映射目錄

    mkdir -p /mysqlmultiple/master1/conf.d
    mkdir -p /mysqlmultiple/master1/data
    mkdir -p /mysqlmultiple/master2/conf.d
    mkdir -p /mysqlmultiple/master2/data
    mkdir -p /mysqlmultiple/master3/conf.d
    mkdir -p /mysqlmultiple/master3/data
    mkdir -p /mysqlmultiple/slave/conf.d
    mkdir -p /mysqlmultiple/slave/data

    ? 3.3 創(chuàng)建容器,安裝MySQL
    docker run -d --name mysql8027M33265 \
    -h master1 -p 33265:3306 --net=mysql-network --ip 172.72.0.10 \
    -v /mysqlmultiple/master1/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master1/data:/var/lib/mysql/ \
    -e MYSQL_ROOT_PASSWORD=jem \
    mysql:8.0.27
    
    docker run -d --name mysql8027M33266 \
    -h master2 -p 33266:3306 --net=mysql-network --ip 172.72.0.11 \
    -v /mysqlmultiple/master2/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master2/data:/var/lib/mysql/ \
    -e MYSQL_ROOT_PASSWORD=jem \
    mysql:8.0.27
    
    docker run -d --name mysql8027M33267 \
    -h master3 -p 33267:3306 --net=mysql-network --ip 172.72.0.12 \
    -v /mysqlmultiple/master3/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master3/data:/var/lib/mysql/ \
    -e MYSQL_ROOT_PASSWORD=jem \
    mysql:8.0.27
    
    docker run -d --name mysql8027S33268 \
    -h slave1 -p 33268:3306 --net=mysql-network --ip 172.72.0.13 \
    -v /mysqlmultiple/slave/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/slave/data:/var/lib/mysql/ \
    -e MYSQL_ROOT_PASSWORD=jem \
    mysql:8.0.27
    ? 3.4 參數(shù)文件配置
    cat > /mysqlmultiple/master1/conf.d/my.cnf << "EOF"
    [mysqld]
    user=mysql
    port=3306
    character_set_server=utf8mb4
    secure_file_priv=
    server-id = 802733265
    log-bin =
    binlog_format=row
    expire_logs_days = 30
    max_binlog_size = 100M
    binlog-ignore-db = mysql
    binlog-ignore-db = information_schema
    binlog-ignore-db = performance_schema
    binlog-ignore-db = sys
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema
    replicate_ignore_db=mysql
    replicate_ignore_db=sys
    gtid-mode=ON
    enforce-gtid-consistency=on
    skip_name_resolve
    report_host=172.72.0.10
    EOF
    
    cat > /mysqlmultiple/master2/conf.d/my.cnf << "EOF"
    [mysqld]
    user=mysql
    port=3306
    character_set_server=utf8mb4
    secure_file_priv=
    server-id = 802733266
    log-bin =
    binlog_format=row
    expire_logs_days = 30
    max_binlog_size = 100M
    binlog-ignore-db = mysql
    binlog-ignore-db = information_schema
    binlog-ignore-db = performance_schema
    binlog-ignore-db = sys
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema
    replicate_ignore_db=mysql
    replicate_ignore_db=sys
    gtid-mode=ON
    enforce-gtid-consistency=ON
    skip_name_resolve
    report_host=172.72.0.11
    EOF
    
    cat > /mysqlmultiple/master3/conf.d/my.cnf << "EOF"
    [mysqld]
    user=mysql
    port=3306
    character_set_server=utf8mb4
    secure_file_priv=
    server-id = 802733267
    log-bin =
    binlog_format=row
    expire_logs_days = 30
    max_binlog_size = 100M
    binlog-ignore-db = mysql
    binlog-ignore-db = information_schema
    binlog-ignore-db = performance_schema
    binlog-ignore-db = sys
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema
    replicate_ignore_db=mysql
    replicate_ignore_db=sys
    gtid-mode=ON
    enforce-gtid-consistency=ON
    skip_name_resolve
    report_host=172.72.0.12
    EOF
    
    cat > /mysqlmultiple/slave/conf.d/my.cnf << "EOF"
    [mysqld]
    user=mysql
    port=3306
    character_set_server=utf8mb4
    secure_file_priv=''
    server-id = 802733268
    log-bin =
    binlog_format=row
    expire_logs_days = 30
    max_binlog_size = 100M
    binlog-ignore-db = mysql
    binlog-ignore-db = information_schema
    binlog-ignore-db = performance_schema
    binlog-ignore-db = sys
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema
    replicate_ignore_db=mysql
    replicate_ignore_db=sys
    gtid-mode=ON
    enforce-gtid-consistency=ON
    skip_name_resolve
    report_host=172.72.0.13
    master-info-repository = table
    relay-log-info-repository = table
    EOF
    
    docker restart mysql8027M33265
    docker restart mysql8027M33266
    docker restart mysql8027M33267
    docker restart mysql8027S33268
    docker ps

     登陸容器,確認數(shù)據(jù)
    docker ps --format “table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}”

    Docker容器如何實現(xiàn)MySQL多源復制

    ? 3.5 登陸MySQL
    docker exec -it mysql8027M33265 mysql -uroot -pjem
    mysql -uroot -pjem -h292.168.1.54 -P33265 -e "select @@hostname,@@server_id,@@server_uuid"
    mysql -uroot -pjem -h292.168.1.54 -P33266 -e "select @@hostname,@@server_id,@@server_uuid"
    mysql -uroot -pjem -h292.168.1.54 -P33267 -e "select @@hostname,@@server_id,@@server_uuid"
    mysql -uroot -pjem -h292.168.1.54 -P33268 -e "select @@hostname,@@server_id,@@server_uuid"
    
    遠程登陸需要修改密碼
    docker exec -it mysql8027M33266 mysql -uroot -pjem
    mysql> alter user root@'%' identified with mysql_native_password by 'root';   --更改密碼
    mysql>  flush privileges;
    docker exec -it mysql8027S33268 mysql -uroot -pjem

    ?? 4.主從配置

    ? 4.1 主庫配置
    --在 3 臺主庫
    mysql -uroot -proot -h292.168.1.54 -P33265
    mysql -uroot -proot -h292.168.1.54 -P33266
    mysql -uroot -proot -h292.168.1.54 -P33267
    mysql> create user repl@'%' identified with mysql_native_password by 'root';
    mysql> grant all on *.* to repl@'%' with grant option;
    mysql> flush privileges;
    select user,host,grant_priv,password_last_changed,authentication_string from mysql.user;
    show master status \G;
    show slave hosts;
    select @@hostname,@@server_id,@@server_uuid;
    ? 4.2 從庫配置
    mysql -uroot -proot -h292.168.1.54 -P33268
    change master to
    master_host='172.72.0.10',
    master_port=3306,master_user='repl',
    master_password='root',
    master_auto_position=1 FOR CHANNEL 'Master1';
    show slave status \G;
    -- 啟動所有 SLAVE
    mysql> START SLAVE;
    --主庫創(chuàng)建數(shù)據(jù)測試
    mysql -uroot -proot -h292.168.1.54 -P33265
    mysql> create database test;
    --主庫2和3
    change master to
    master_host='172.72.0.11',
    master_port=3306,
    master_user='repl',
    master_password='root',
    master_auto_position=1 FOR CHANNEL 'Master2';
    change master to
    master_host='172.72.0.12',
    master_port=3306,
    master_user='repl',
    master_password='root',
    master_auto_position=1 FOR CHANNEL 'Master3';
    -- 也可以單獨啟動需要同步的通道
    START SLAVE FOR CHANNEL 'master2';
    START SLAVE FOR CHANNEL 'master3';
    select a.master_log_pos,a.host,a.user_name,a.user_password,a.port,a.uuid,a.channel_name 
    from mysql.slave_master_info a;

    Docker容器如何實現(xiàn)MySQL多源復制

    Docker容器如何實現(xiàn)MySQL多源復制

    ?? 5.測試多源復制

    -- mysql -uroot -proot -h292.168.1.54 -P33265
    create database master1;
    use master1;
    CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
    insert into test1 values(1,1);
    -- mysql -uroot -proot -h292.168.1.54 -P33266
    create database master2;
    use master2;
    CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
    insert into test2 values(2,2);
    -- mysql -uroot -proot -h292.168.1.54 -P33267
    create database master3;
    use master3;
    CREATE TABLE `test3` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
    insert into test3 values(3,3);
    --從庫查詢
    -- mysql -uroot -proot -h292.168.1.54 -P33268
    show databases;
    SELECT * FROM master1.test1;
    SELECT * FROM master2.test2;
    SELECT * FROM master3.test3;

    ?? 6. 注意的點

    1、初次配置耗時較長,需要將各個 master 的數(shù)據(jù) dump 下來,再 source 到 slave 上。
    2、需要考慮各 master 數(shù)據(jù)增長頻率,slave 的數(shù)據(jù)增長頻率是這些數(shù)據(jù)的總和。如果太高,會導致大量的磁盤 IO,造成數(shù)據(jù)更新延遲,最嚴重的是會影響正常的查詢。
    3、如果多個主數(shù)據(jù)庫實例中存在同名的庫,則同名庫的表都會放到一個庫中;
    4、如果同名庫中的表名相同且結(jié)構(gòu)相同,則數(shù)據(jù)會合并到一起;如果結(jié)構(gòu)不同,則先建的有效。

    以上就是“Docker容器如何實現(xiàn)MySQL多源復制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI