服务端常用技术
1.动静分离、反向代理
2.SOA服务治理框架(dubbo)
3.mycat+mysql主从(读写分离)
1. mysql的主从架构介绍
1.单主多从
应用场景:MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都很少很少。
缺点:当slave特别多时,master就会遇到网络瓶颈。
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)。
图解为:
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