Myql集群-单主多从

服务端常用技术

1.动静分离、反向代理

2.SOA服务治理框架(dubbo)

3.mycat+mysql主从(读写分离)

1. mysql的主从架构介绍

1.单主多从

Myql集群-单主多从_第1张图片

应用场景:MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都很少很少。

缺点:当slave特别多时,master就会遇到网络瓶颈。

2.双主架构

Myql集群-单主多从_第2张图片

应用场景:一个应用前台和后台用的不同的服务器,数据库大多数是主从结构,但是日志数据库,需要共用一个,这个时候可以把两边的日志数据库设为双主。

缺点:主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:

在第一个服务器上执行:mysql> UPDATE tbl SET col=col + 1;

在第二个服务器上执行:mysql> UPDATE tbl SET col=col * 2;

那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。

3.主动-被动模式的Master-Master

这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。

4.级联复制架构 Master –Slaves - Slaves

应用场景:在有些应用场景中,可能读写压力差别比较大,读压力特别的大,一个Master可能需要上10台甚至更多的Slave才能够支撑注读的压力。这时候,Master就会比较吃力了,因为仅仅连上来的SlaveIO线程就比较多了,这样写的压力稍微大一点的时候,Master端因为复制就会消耗较多的资源,很容易造成复制的延时。

操作:在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开—log-slave-update选项。然后,通过二级(或者是更多级别)复制来减少Master端因为复制所带来的压力。也就是说,我们首先通过少数几台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其他的Slave再从第一级Slave集群来进行复制。从第一级Slave进行复制的Slave,我称之为第二级Slave集群。如果有需要,我们可以继续往下增加更多层次的复制。这样,我们很容易就控制了每一台MySQL上面所附属Slave的数量。这种架构我称之为Master-Slaves-Slaves架构

缺点:Slave并没有减少写的量,所有Slave实际上仍然还是应用了所有的数据变更操作,没有减少任何写IO。相反,Slave越多,整个集群的写IO总量也就会越多,我们没有非常明显的感觉,仅仅只是因为分散到了多台机器上面,所以不是很容易表现出来。

此外,增加复制的级联层次,同一个变更传到最底层的Slave所需要经过的MySQL也会更多,同样可能造成延时较长的风险。

5.带从服务器的Master-Master-Slaves结构

最大的好处就是既可以避免主Master的写入操作不会受到Slave集群的复制所带来的影响,同时主Master需要切换的时候也基本上不会出现重搭Replication的情况。但是,这个架构也有一个弊端,那就是备用的Master有可能成为瓶颈,因为如果后面的Slave集群比较大的话,备用Master可能会因为过多的SlaveIO线程请求而成为瓶颈。当然,该备用Master不提供任何的读服务的时候,瓶颈出现的可能性并不是特别高,如果出现瓶颈,也可以在备用Master后面再次进行级联复制,架设多层Slave集群。当然,级联复制的级别越多,Slave集群可能出现的数据延时也会更为明显,所以考虑使用多层级联复制之前,也需要评估数据延时对应用系统的影响。

说明:http://www.111cn.net/database/mysql/120444.htm

2.主从原理介绍

复制的基本过程如下:

1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;

3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。

简单来讲就是从库先通过io线程读取主库的二进制文件(Master_Log_File)和位置(Read_Master_Log_Pos)然后缓存到本地(从库服务器)的中继文件(Relay_Log_File)中并记录已经读取到的位置(Relay_Log_Pos),再通过从库的sql线程去读取中继文件(Relay_Log_File),这个sql线程执行会记录已经执行到了哪个文件(Relay_Master_Log_File)和哪个位置(Exec_Master_Log_Pos)。

图解为:

Myql集群-单主多从_第3张图片

2.安装mysql

2.1 下载安装包

> tar -zxvf mysql-5.6.32-linux-glibc2.5-x86_64.tar.gz    //解压

把mysql文件夹移动到 /usr/local/ 下

> mv mysql-5.6.32-linux-glibc2.5-x86_64 /usr/local/mysql

2.2 创建MySQL用户和组

> groupadd mysql

> adduser -r -g mysql mysql

> chown -R mysql.mysql /usr/local/mysql  //修改mysql目录所属mysql用户

2.3 安装 

> /usr/local/mysql/scripts/mysql_install_db

上面命令在cenos 7下面会报错,用以下命令替换:

> /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

修改配置文件my.cnf,必须要修改才能使用mycat

最后一行添加

lower_case_table_names = 1

2.4 设置mysql服务

> cp -f /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld

2.5 启动mysql 

> service mysqld start

2.6 把mysql命令加入环境变量

修改/etc/profile文件,最后行添加export PATH=$PATH:/usr/local/mysql/bin

然后执行 

> source /etc/profile   //使配置立即生效

登陆mysql如果提示错误 Can't connect to local MySQL server through socket '/tmp/mysql.sock'

执行命令

> ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 后再登陆

root用户初始密码为空,修改密码使用mysqladmin命令

> mysqladmin -uroot -p password 密码

登陆客户端 

>mysql -uroot -p

创建测试数据库

CREATE database db1;

CREATE database db2;

CREATE database db3;

至此mysql已经安装完成了

常见问题链接:

http://www.cnblogs.com/kerrycode/p/4368312.html

3. 设置mysql主从

3.1 主数据库配置

1)在Master MySQL上创建一个用户‘devinmaster’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。

>create user devinmaster;

2)为新建的用户赋权限

mysql> GRANT ALL PRIVILEGES ON *.* TO 'devinmaster'@'%' IDENTIFIED BY  'devin123' WITH GRANT OPTION;

说明:一下192.168.0.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.57.0-192.168.57.255的Server都可以以devinmaster用户登陆主服务器。当然你也可以指定固定Ip。修改密码命令:update user set password=password('devin123'),host='192.168.57.%' where user='devinmaster';

3)查看主数据库日志配置:

> SHOW MASTER STATUS;

4)修改配置文件

log_bin = mysql-bin  #记录操作日志

binlog_ignore_db =  mysql  #不同步mysql系统数据库

server_id = 1

3.2 从数据库配置

1)找到my.conf文件夹,增加如下配置:

[mysqld]

log_bin = mysql-bin  #记录操作日志

replicate_ignore_db = mysql #不同步mysql系统数据库

slave_skip_errors = all

server_id = 3

2)链接主数据库

change master to master_host='192.168.57.129',master_port=3306,master_user='devinmaster',master_password='devin123', master_log_file='master-bin.000025',master_log_pos=120;


说明:

Slave_IO_Running: NO 问题排查:http://www.111cn.net/database/mysql/79902.htm

关于主从设置的说明:

http://www.xuebuyuan.com/698098.html

mysql集群与mysql主从区别

http://blog.csdn.net/wutian713/article/details/50682360

你可能感兴趣的:(Myql集群-单主多从)