MySQL Scale out
简介
MySQL复制中较常见的复制架构有“一主一从”、“一主多从”、“双主”、“多级复制”和“多主环形机构”等,见下图;
最常用,也最灵活的就要数“一主多从”复制架构了,其能满足多种需求,如:
为不同的角色使用不同的备库(例如添加不同的索引或使用不同的存储引擎);
把一台备库当做待用的主库,除了复制没有其它数据传输;
将一台备库放在远程数据中心,用作灾难恢复;
延迟一个或多个备库,以备灾难恢复;
使用其中一个备库,作为备份、培训、开发或者测试使用服务器;
而“双主”复制架构则用于特殊的场景下,如两个处于不同地理位置的办公室,且都需要一份可写的数据拷贝;
这种架构最大的问题是如何解决数据冲突和不一致,尤其当两台服务器同时修改同一行记录,或同时在两台服务器上向一个包含auto_increment列的表里插入数据时;
而通过将一台服务器设置为只读的被动服务器,则可以很好的避免数据写入冲突的问题,这种主动-被动模式下的主-主复制架构使得反复切换主动和被动服务器非常方便,可以实现在不关闭服务器的情况下执行维护、优化表、升级操作系统或其他任务;
配置主动-被动模式的主-主复制架构的一般流程:
确保两台服务器上有相同的数据;
启用二进制日志,选择唯一的服务器ID,并创建复制账号;
启用备库更新的日志记录,这是故障转移和故障恢复的关键;
把被动服务器配置成只读,防止可能与主动服务器上的更新产生冲突;
启动每个服务器的MySQL实例;
将每个主库设置为对方的备库,使用新创建的二进制日志开始工作;
同时为了消除不同地理位置的站点单点故障问题,可以为每个主库增加冗余,即为每一个主库增加一个从库;
而MMM(=Master-Master Replication Manager for MySQL)则是一套脚本集合,用以监控、管理双主复制架构,通过设置一个可写的VIP和多个只读的VIP,完成故障自动转移、读负载分摊等功能;
架构设计
服务器规划
虚IP规划
配置部署
双主复制架构部署
MySQL或MariaDB的安装初始化可详见博客“MySQL架构”
利用mysqld_multi在一台主机上启动多个mysqld实例
数据库初始化
# 在主机Host1和Host2上cd /usr/local/mysqlscripts/mysql_install_db --user=mysql --datadir=/data/mariadb_data_3406/scripts/mysql_install_db --user=mysql --datadir=/data/mariadb_data_3506/
数据库配置
# 在主机Host1上vi /etc/my.cnf[mysqld_multi]mysqld = /usr/local/mysql/bin/mysqld_safemysqladmin = /usr/local/mysql/bin/mysqladmin[mysqld1]port = 3406socket = /tmp/mysql3406.sockskip-external-lockingkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 16Mthread_concurrency = 2datadir = /data/mariadb_data_3406innodb_file_per_table = 1default_storage_engine = InnoDBlog-bin=mysql-binrelay-log=/data/relaylogs_3406/relay-bin # 指定中继日志路径log_slave_updates=1 # 开启从库更新操作写入二进制日志功能auto_increment_increment=2 # 双主复制中自增长字段的步长auto_increment_offset=1 # 双主复制中自增长字段的起始值,此为1sync_binlog = 1 # 可保证事务日志及时写入磁盘文件binlog_format=rowserver-id = 11# 注意server-id的唯一性[mysqld2]port = 3506socket = /tmp/mysql3506.sockskip-external-lockingkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 16Mthread_concurrency = 2datadir = /data/mariadb_data_3506innodb_file_per_table = 1default_storage_engine = InnoDBlog-bin=mysql-binrelay-log=/data/relaylogs_3506/relay-binlog_slave_updates=1sync_binlog = 1binlog_format=rowserver-id = 12# 在主机Host2上vi /etc/my.cnf[mysqld_multi]mysqld = /usr/local/mysql/bin/mysqld_safemysqladmin = /usr/local/mysql/bin/mysqladmin[mysqld1]port = 3406socket = /tmp/mysql3406.sockskip-external-lockingkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 16Mthread_concurrency = 2datadir = /data/mariadb_data_3406innodb_file_per_table = 1default_storage_engine = InnoDBlog-bin=mysql-binrelay-log=/data/relaylogs_3406/relay-binlog_slave_updates=1auto_increment_increment=2 # # 双主复制中自增长字段的步长auto_increment_offset=2 # 双主复制中自增长字段的起始值,此为2sync_binlog = 1binlog_format=rowserver-id = 21[mysqld2]port = 3506socket = /tmp/mysql3506.sockskip-external-lockingkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 16Mthread_concurrency = 2datadir = /data/mariadb_data_3506innodb_file_per_table = 1default_storage_engine = InnoDBlog-bin=mysql-binrelay-log=/data/relaylogs_3506/relay-binlog_slave_updates=1sync_binlog = 1binlog_format=rowserver-id = 22
启动数据库实例
# 在主机Host1和Host2上/etc/init.d/mysqld_multi start 1 # 停止服务操作是/etc/init.d/mysqld_multi stop 1/etc/init.d/mysqld_multi start 2 # 停止服务操作是/etc/init.d/mysqld_multi stop 2
登录数据库
# 在主机Host1和Host2上mysql -S /tmp/mysql3406.sock # 登录master1或master2mysql -S /tmp/mysql3506.sock # 登录slave1或slave2
创建所需账户(在Master1实例上)
grant replication client on *.* to '3m_moni'@'192.168.0.%' identified by '3m_12345'; # 创建MMM的监控账户grant super,replication client,process on *.* to '3m_agen'@'192.168.0.%' identified by '3m_12345'; # 创建MMM的代理账户grant replication slave on *.* to '3m_repl'@'192.168.0.%' identified by '3m_12345'; # 创建复制账户
配置数据同步
# 每次从库连接主库前,需先查询对应主库的二进制日志文件及其事件位置,即在主库上执行show master status即可,据此决定从库连接时的master_log_file和master_log_pos参数;# slave1实例上change master to master_host='192.168.0.45',master_port=3406,master_user='3m_repl',master_password='3m_12345',master_log_file='mysql-bin.000001',master_log_pos=2448;# master2实例上change master to master_host='192.168.0.45',master_port=3406,master_user='3m_repl',master_password='3m_12345',master_log_file='mysql-bin.000002',master_log_pos=365;# slave2实例上change master to master_host='192.168.0.46',master_port=3406,master_user='3m_repl',master_password='3m_12345',master_log_file='mysql-bin.000004',master_log_pos=342;# master1实例上change master to master_host='192.168.0.46',master_port=3406,master_user='3m_repl',master_password='3m_12345',master_log_file='mysql-bin.000004',master_log_pos=342;
查看同步状态
# 重点检查Slave_IO_Running、Slave_SQL_Running和Master_Server_Id等参数MariaDB [(none)]> show slave status/G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.45 Master_User: 3m_repl Master_Port: 3406 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 326 Relay_Log_File: relay-bin.000010 Relay_Log_Pos: 613 Relay_Master_Log_File: mysql-bin.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes Master_Server_Id: 11
MMM安装部署
Host1主机上:部署agent和monitor
yum -y install mysql-mmm-*# 配置公共设置vi /etc/mysql-mmm/mmm_common.confactive_master_role writer<host default> cluster_interface eth0 pid_path /var/run/mysql-mmm/mmm_agentd.pid bin_path /usr/libexec/mysql-mmm/ replication_user 3m_repl# 复制账户 replication_password 3m_12345# 复制账户密码 agent_user 3m_agen# agent账户 agent_password 3m_12345# agent账户密码</host><host db1> ip 192.168.0.45 mysql_port 3406# 可指定需连接的mysqld的端口 mode master peer db2# peer表示db1、db2是同等级别的</host><host db2> ip 192.168.0.46 mysql_port 3406 mode master peer db1</host><host db3> ip 192.168.0.45 mysql_port 3506 mode slave</host><host db4> ip 192.168.0.46 mysql_port 3506 mode slave</host><role writer> hosts db1, db2 ips 192.168.0.11# 可写VIP只配置一个 mode exclusive# 表示排它</role><role reader> hosts db1, db2,db3,db4 ips 192.168.0.12,192.168.0.13,192.168.0.14,192.168.0.15 # 只读VIP可配置多个 mode balanced# 表示可以共用</role>==========scp mmm_common.conf 192.168.0.46:/etc/mysql-mmm/ # 将公共配置文件拷贝至其它主机==========# 配置监控设置vi /etc/mysql-mmm/mmm_mon.confinclude mmm_common.conf<monitor> ip 127.0.0.1 pid_path /var/run/mysql-mmm/mmm_mond.pid bin_path /usr/libexec/mysql-mmm status_path /var/lib/mysql-mmm/mmm_mond.status ping_ips 192.168.0.45,192.168.0.46# 健康监测时需ping的主机IP,不是VIP哦 auto_set_online 60</monitor><host default> monitor_user 3m_moni# 监控账户 monitor_password 3m_12345 # 监控账户密码</host>debug 0# 配置agent设置vi /etc/mysql-mmm/mmm_agent.confinclude mmm_common.confthis db1# 因为在一台主机上启用了2个mysqld实例,故可配置2个this参数哦this db3
Host2主机上:只需部署agent
yum -y install mysql-mmm-agent# 配置agent设置vi /etc/mysql-mmm/mmm_agent.confinclude mmm_common.confthis db2this db4
服务启动
# 在主机Host1上[root@mysql mysql-mmm]# mmm_control showdb1(192.168.0.45) master/ONLINE. Roles: reader(192.168.0.14), writer(192.168.0.11)db2(192.168.0.46) master/ONLINE. Roles: reader(192.168.0.13)db3(192.168.0.45) slave/ONLINE. Roles: reader(192.168.0.15)db4(192.168.0.46) slave/ONLINE. Roles: reader(192.168.0.12)
测试验证
查看双主复制架构中基于MMM实现的状态信息:
# 在主机Host1上[root@mysql mysql-mmm]# mmm_control showdb1(192.168.0.45) master/ONLINE. Roles: reader(192.168.0.14), writer(192.168.0.11)db2(192.168.0.46) master/ONLINE. Roles: reader(192.168.0.13)db3(192.168.0.45) slave/ONLINE. Roles: reader(192.168.0.15)db4(192.168.0.46) slave/ONLINE. Roles: reader(192.168.0.12)
手动进行各节点的健康监测
# 在主机Host1上[root@mysql mysql-mmm]# mmm_control checksdb4ping [last change: 2014/05/06 22:38:27]OKdb4mysql[last change: 2014/05/06 22:38:27]OKdb4rep_threads[last change: 2014/05/06 22:38:27]OKdb4rep_backlog[last change: 2014/05/06 22:38:27]OK: Backlog is nulldb2ping [last change: 2014/05/06 22:38:27]OKdb2mysql[last change: 2014/05/06 22:38:27]OKdb2rep_threads[last change: 2014/05/06 22:38:27]OKdb2rep_backlog[last change: 2014/05/06 22:38:27]OK: Backlog is nulldb3ping [last change: 2014/05/06 22:38:27]OKdb3mysql[last change: 2014/05/06 22:38:27]OKdb3rep_threads[last change: 2014/05/06 22:38:27]OKdb3rep_backlog[last change: 2014/05/06 22:38:27]OK: Backlog is nulldb1ping [last change: 2014/05/06 22:38:27]OKdb1mysql[last change: 2014/05/06 22:38:27]OKdb1rep_threads[last change: 2014/05/06 22:38:27]OKdb1rep_backlog[last change: 2014/05/06 22:38:27]OK: Backlog is null
补充说明
在本篇的演示案例中,前端程序若要与MySQL通信,则写库需连接192.168.0.11:3406,读库可连接192.168.0.12-15中的一个或多个,端口可能是3406或3506;
在只读VIP漂移时,会导致前端程序连接的mysqld端口发生变化,所以生产环境下还是统一使用3306端口为宜;
利用MMM实现了双主复制架构中的故障自动转移后,mysql并非直接与前端程序通信,还需配合使用读写分离器(如Ameoba),以统一对外的连接地址,由读写分离器负责读写的向下分配;

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

我們將在本文中向您介紹CrushOn.AI的最佳替代方案,並提供免費且無限的訊息功能。現在市場上有許多人工智慧平台,用戶可以與來自動漫等各種媒體的角色進行對話,這為用戶提供了更有趣和互動性的體驗。什麼是CrushOn.AI? CrushonAI是一個AI聊天機器人平台,使用者可以透過與虛擬角色進行對話來體驗互動的樂趣。用戶有機會與動漫等多種媒體中的虛擬角色展開交流,建立聯繫,並創造與自己最喜歡的角色相關的故事情節。提供無限免費訊息的CrushOn.AI的最佳替代方案如果你正在尋找最好的Crush

《蒼翼混沌效應》擁有許多角色,每位角色都有獨特的身份和背景故事。為此,小編特為各位玩家整理了蒼翼混沌效應角色介紹。蒼翼混沌效應有幾個角色答:有7個角色。 1.【死神】拉格納·查·布拉德艾奇(綽號RG、尼桑)其與弟弟、妹妹曾由教堂修女撫養,在一天,六英雄之一的反派闖入,殺害修女,燒毀教堂,帶走妹妹,留下弟弟「事象兵器」冰劍雪女。 2、諾愛爾梵蜜利昂梵蜜利昂家的養女,與拉格納的妹妹長得幾乎一樣。畢業後進入統禦機關工作,擔任拉格納弟弟的秘書官。 3.λ-11統稱拉姆達、十一妹。原開發者放棄後,九重救並

錨點降臨是一款擁有高畫質美少女二次元主題的3D回合卡牌遊戲,提供了豐富角色的精彩組合可供玩家來探索和體驗,擁有許多精品陣容的強力搭配,新人玩家也是好奇新手池有哪些強力角色推薦,以下來看看新手十連金的選擇參考!錨點降臨新手池強力角色推薦第一個十連選艾莉絲,她主要是一個單體雷系爆發角色,單體輸出非常爆炸的,對新人的體驗也會是非常的友善的,所以十分推薦選取。 10抽必金建議選擇「艾莉絲」+「羚角」的組合,艾莉絲是最值得選的金皮雷屬性輸出角色,比新手卡池中的另外2個角色要強得不是一星半點。艾莉絲可以透過特

PHP是一種廣泛應用的程式語言,被廣泛用於創建和開發各種Web應用程式。在許多網路應用程式中,角色權限管理系統是一個重要的功能,它可以確保不同使用者擁有適當的存取權限。本文將介紹如何使用PHP來實作一個簡單而實用的角色權限管理系統。角色權限管理系統的基本概念是將使用者分為不同的角色,並為每個角色分配相應的權限。這樣,使用者只能執行他們有權限執行的操作,從而確保系統的

在《蒼翼:混沌效應》遊戲中有許多角色供玩家選擇,有很多玩家都想知道《蒼翼:混沌效應》角色推薦哪些,小編推薦大家選擇NO-11、白面、諾愛兒,接下來就由小編為大家詳細的介紹一下《蒼翼:混沌效應》角色推薦攻略吧,有興趣的玩家快來和小編一起看看吧!《蒼翼:混沌效應》角色推薦:一、NO -11角色解析1、NO-11的傷害高,且還有不錯的機動性。 2.上手難度一般,適合新手玩家使用。 3.專屬模組推薦強化跳a、技能和長按技能奧義。二、白面角色解析1、上手難度較高,適合有一定操作的玩家。 2.角色生存能力強,可以彈

《誅仙世界》二測結束後,玩家的評價兩極化。在二測結束後,官方也列出了調校清單,從經濟、養成、玩法、功能、美術五個面向進行調整。表示針對玩家回饋的問題都會做出相對應的最佳化對策。今日,《誅仙世界》放出了爆改計畫中角色醫美進度展示。透過畫面對比,來向展示這幾個月來,專案組對角色爆改的階段性成果。大家覺得哪個版本比較好看呢?以下是先前《誅仙世界》公佈的曝光計畫:

永夜降臨復甦強勢角色有哪些?一個遊戲內強勢的角色會帶給玩家舒適的體驗,那麼在永夜降臨復甦中又有哪些呢?小編接下來會來把整理的永夜降臨復甦強勢角色總結分享在下方,有需要的可以來看看。 《永夜降臨:復甦》強勢角色一覽一、角色強度榜一覽T0:阿庫婭、波琪T1:小艾芙、伊蓮、菲妮T2:小麥二、最強角色推薦(1)阿庫婭角色解析1、擅長使用各種武器進行輸出,取得難度低,且傷害高。 2.傷害高的同時也具備高額的血量,可以為自己加上護盾。 3.每次攻擊敵方目標的時候為敵方加上印記,增加自己的傷害。 (2)小艾芙角色

CakePHP是一款受歡迎的PHP開發框架,它提供了一個全面的權限控制機制,也就是AccessControlList(ACL)。使用ACL可以幫助你控制應用程式中每個使用者的存取權限。在本文中,我們將介紹如何在CakePHP中使用ACL角色。配置ACL元件首先,我們需要設定CakePHP中的ACL元件。在app_controller.php中加入以下程式碼:
