mysql读写分离实现要多少台主机
一般可以用三台主机来实现。一台主服务器,两台从服务器,一台用于读服务,一台用于写服务,两台从服务自动缓存。
主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接。主从服务器利用MySQL的二进制日志文件,实现数据同步。二进制日志由主服务器产生,从服务器响应获取同步数据库。
读写分离是为了提供程序的性能,随着用户的增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作。
系统使用缓存后,很大部分功能是不用通过数据库就可以完成的。但是仍然有一部分功能需要和全部的写入操作需要访问数据库。所以要提供主从数据库来分离读写操作,主数据库同步到从数据库后,从数据库一般由多台数据库组成这样才能达到减轻压力的目的
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
如下图所示:
下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考。
一、MySQL的安装与配置
值得一提的是,我的安装过程都是源码包编译安装的,并且所有的配置与数据等都统一规划到了/opt/mysql目录中,因此在一台服务器上安装完成以后,可以将整个mysql目录打包,然后传到其它服务器上解包,便可立即使用。
二、MySQL主从复制
场景描述:
主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据。
从数据库服务器:192.168.10.131,MySQL已经安装,并且无应用数据。
2.1 主服务器上进行的操作
启动mysql服务
/opt/mysql/init.d/mysql start
通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'
授权给从数据库服务器192.168.10.131
mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.10.131' identified by ‘password’;
查询主数据库状态
Mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 261 | | |
+------------------+----------+--------------+------------------+
记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。
2.2 配置从服务器
修改从服务器的配置文件/opt/mysql/etc/my.cnf
将 server-id = 1修改为 server-id = 10,并确保这个ID没有被别的MySQL服务所使用。
启动mysql服务
/opt/mysql/init.d/mysql start
通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'
执行同步SQL语句
mysql> change master to
master_host=’192.168.10.130’,
master_user=’rep1’,
master_password=’password’,
master_log_file=’mysql-bin.000005’,
master_log_pos=261;
正确执行后启动Slave同步进程
mysql> start slave;
主从同步检查
mysql> show slave status\G
==============================================
**************** 1. row *******************
Slave_IO_State:
Master_Host: 192.168.10.130
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 415
Relay_Log_File: localhost-relay-bin.000008
Relay_Log_Pos: 561
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: YES
Slave_SQL_Running: YES
Replicate_Do_DB:
……………省略若干……………
Master_Server_Id: 1
1 row in set (0.01 sec)
==============================================
其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。
如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主数据库状态
mysql> show master status;
(3)记录下 FILE 及 Position 的值。
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
(4)取消主数据库锁定
mysql> UNLOCK TABLES;
2.3 验证主从复制效果
主服务器上的操作
在主服务器上创建数据库first_db
mysql> create database first_db;
Query Ok, 1 row affected (0.01 sec)
在主服务器上创建表first_tb
mysql> create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
在主服务器上的表first_tb中插入记录
mysql> insert into first_tb values (001,’myself’);
Query Ok, 1 row affected (0.00 sec)
在从服务器上查看
mysql> show databases;
=============================
+--------------------+
| Database |
+--------------------+
| information_schema |
| first_db |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
=============================
数据库first_db已经自动生成
mysql> use first_db
Database chaged
mysql> show tables;
=============================
+--------------------+
| Tables_in_first_db |
+--------------------+
| first_tb |
+--------------------+
1 row in set (0.02 sec)
=============================
数据库表first_tb也已经自动创建
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
记录也已经存在
由此,整个MySQL主从复制的过程就完成了,接下来,我们进行MySQL读写分离的安装与配置。
三、MySQL读写分离
场景描述:
数据库Master主服务器:192.168.10.130
数据库Slave从服务器:192.168.10.131
MySQL-Proxy调度服务器:192.168.10.132
以下操作,均是在192.168.10.132即MySQL-Proxy调度服务器 上进行的。
3.1 MySQL的安装与配置
具体的安装过程与上文相同。
3.2 检查系统所需软件包
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*
libevent* glib*
若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。
3.3 编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
lua可通过以下方式获得
下载源码包
从rpm.pbone.net搜索相关的rpm包
download.fedora.redhat.com/pub/fedora/epel/5/i386/lua-5.1.4-4.el5.i386.rpm
download.fedora.redhat.com/pub/fedora/epel/5/x86_64/lua-5.1.4-4.el5.x86_64.rpm
这里我们建议采用源码包进行安装
cd /opt/install
wget hz
tar zvfx lua-5.1.4.tar.gz
cd lua-5.1.4
vi src/Makefile
在 CFLAGS= -O2 -Wall $(MYCFLAGS) 这一行记录里加上-fPIC,更改为 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 来避免编译过程中出现错误。
make linux
make install
cp etc/lua.pc /usr/lib/pkgconfig/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig
3.4 安装配置MySQL-Proxy
MySQL-Proxy可通过以下网址获得:
推荐采用已经编译好的二进制版本,因为采用源码包进行编译时,最新版的MySQL-Proxy对automake,glib以及libevent的版本都有很高的要求,而这些软件包都是系统的基础套件,不建议强行进行更新。
并且这些已经编译好的二进制版本在解压后都在统一的目录内,因此建议选择以下版本:
测试平台为RHEL5 32位,因此选择32位的软件包
wget
tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy
创建mysql-proxy服务管理脚本
mkdir /opt/mysql-proxy/init.d/
vim mysql-proxy
01 #!/bin/sh
02 #
03 # mysql-proxy This script starts and stops the mysql-proxy daemon
04 #
05 # chkconfig: - 78 30
06 # processname: mysql-proxy
07 # description: mysql-proxy is a proxy daemon to mysql
08
09 # Source function library.
10 . /etc/rc.d/init.d/functions
11
12 #PROXY_PATH=/usr/local/bin
13 PROXY_PATH=/opt/mysql-proxy/bin
14
15 prog="mysql-proxy"
16
17 # Source networking configuration.
18 . /etc/sysconfig/network
19
20 # Check that networking is up.
21 [ ${NETWORKING} = "no" ] && exit 0
22
23 # Set default mysql-proxy configuration.
24 #PROXY_OPTIONS="--daemon"
25 PROXY_OPTIONS="--admin-username=root --admin-password=password --proxy-read-only-backend-addresses=192.168.10.131:3306 --proxy-backend-addresses=192.168.10.130:3306 --admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua --proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua"
26 PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid
27
28 # Source mysql-proxy configuration.
29 if [ -f /etc/sysconfig/mysql-proxy ]; then
30 . /etc/sysconfig/mysql-proxy
31 fi
32
33 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
34
35 # By default it's all good
36 RETVAL=0
37
38 # See how we were called.
39 case "$1" in
40 start)
41 # Start daemon.
42 echo -n $"Starting $prog: "
43 $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql --log-level=warning --log-file=/opt/mysql-proxy/log/mysql-proxy.log
44 RETVAL=$?
45 echo
46 if [ $RETVAL = 0 ]; then
47 touch /var/lock/subsys/mysql-proxy
48 fi
49 ;;
50 stop)
51 # Stop daemons.
52 echo -n $"Stopping $prog: "
53 killproc $prog
54 RETVAL=$?
55 echo
56 if [ $RETVAL = 0 ]; then
57 rm -f /var/lock/subsys/mysql-proxy
58 rm -f $PROXY_PID
59 fi
60 ;;
61 restart)
62 $0 stop
63 sleep 3
64 $0 start
65 ;;
66 condrestart)
67 [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
68 ;;
69 status)
70 status mysql-proxy
71 RETVAL=$?
72 ;;
73 *)
74 echo "Usage: $0 {start|stop|restart|status|condrestart}"
75 RETVAL=1
76 ;;
77 esac
78
79 exit $RETVAL
脚本参数详解:
==============================================
PROXY_PATH=/opt/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径
PROXY_OPTIONS="--admin-username=root \ //定义内部管理服务器账号
--admin-password=password \ //定义内部管理服务器密码
--proxy-read-only-backend-addresses=192.168.10.131:3306 \ //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.10.130:3306 \ //定义后端主服务器地址
--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua \ //定义lua管理脚本路径
--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua" \ //定义lua读写分离脚本路径
PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径
$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS \
--daemon \ //定义以守护进程模式启动
--keepalive \ //使进程在异常关闭后能够自动恢复
--pid-file=$PROXY_PID \ //定义mysql-proxy PID文件路径
--user=mysql \ //以mysql用户身份启动服务
--log-level=warning \ //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
--log-file=/opt/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径
==============================================
cp mysql-proxy /opt/mysql-proxy/init.d/
chmod +x /opt/mysql-proxy/init.d/mysql-proxy
mkdir /opt/mysql-proxy/run
mkdir /opt/mysql-proxy/log
mkdir /opt/mysql-proxy/scripts
配置并使用rw-splitting.lua读写分离脚本
最新的脚本我们可以从最新的mysql-proxy源码包中获取
cd /opt/install
wget
tar xzvf mysql-proxy-0.8.1.tar.gz
cd mysql-proxy-0.8.1
cp lib/rw-splitting.lua /opt/mysql-proxy/scripts
在阿里云Centos7.6上面配置Mysql主从数据库(master\/slave),实现读写分...
在高并发场景中,使用单一数据库服务器承载数据压力可能引发性能瓶颈。为解决这一问题,可以采用 MySQL 主从数据库配置来实现读写分离,减轻数据库负载。主从配置通过一主一从策略实现,主库负责写入操作,从库实时同步主库数据,并承担读取业务,以达到优化性能的目的。主从同步原理基于 MySQL 的二进制日志...
MySQL三主架构高可用性数据安全读写分离mysql三主
读写分离是MySQL三主架构的第三步,用于使MySQL能够处理更高并发量的请求。在读写分离中,我们使用多个MySQL实例和分布式负载均衡器。分布式负载均衡器会将客户端的请求分发到不同的MySQL实例中,并且将读请求分发到只读MySQL实例,将写请求分发到写MySQL实例。通过这种方式,我们可以让MySQL在处理数据读写时...
mysql读写分离原理是什么?要如何操作?
利用mysql proxy来实现的。MySQL Proxy最强大的一项功能是实现“读写分离(Read\/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 当然,主服务器也可以提供查询服务。使用读写分离最大的作用无非是...
技术分享 | MaxScale 实现 MySQL读写分离
然而,MaxScale的读写分离方案并非完美无缺。在所有从实例均延迟较高且无可用节点时,主实例将承担所有读写压力,可能导致过载。因此,没有绝对完美的方案,只有最适合特定场景的策略。接下来,让我们探讨如何配置MaxScale以实现MySQL数据库的读写分离。部署拓扑:后端MySQL采用一主两从半同步复制模式。创建...
mysql读写分离实现要多少台主机
两台从服务自动缓存。主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接。主从服务器利用MySQL的二进制日志文件,实现数据同步。二进制日志由主服务器产生,从服务器响应获取同步数据库。
详解如何利用amoeba(变形虫)实现mysql数据库读写分离
关于mysql的读写分离架构有很多,百度的话几乎都是用mysql_proxy实现的。由于proxy是基于lua脚本语言实现的,所以网上不少网友表示proxy效率不高,也不稳定,不建议在生产环境使用;amoeba是阿里开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),由于是基于java编写的,所以运行环境需要安装jdk...
MySQL的读写分离用什么软件比较好?
在寻找MySQL的高效读写分离解决方案时,众多中间件无疑是一大选择。戒贤整理的中间件列表中,诸如vitess、Mango和Sharding-JDBC,尽管我们团队(UCloud的UDDB小分队)对其他一些如mycat等中间件也有深入研究,但MySQL router由于其局限性,我们并不推荐。其他几款中间件,尽管MySQL router不在其中,但如DRDS...
mysql读写分离实现要多少台主机
由此,整个MySQL主从复制的过程就完成了,接下来,我们进行MySQL读写分离的安装与配置。三、MySQL读写分离场景描述:数据库Master主服务器:192.168.10.130数据库Slave从服务器:192.168.10.131MySQL-Proxy调度服务器:192.168.10.132以下操作,均是在192.168.10.132即MySQL-Proxy调度服务器 上进行的。3.1 MySQL的安装与配置具体的...
mysql集群有哪些方式
在这种模式下,数据库集群被划分为多个部分:写服务器负责处理所有写操作,多个读服务器则负责处理读操作。这种方式实现了负载均衡,有效分散了数据库的读和写压力,提升了数据库整体的性能。但在实现读写分离时需要注意数据同步延迟的问题,以及事务的一致性问题。三、MySQL NDB Cluster MySQL NDB Cluster...
mysql读写分离原理是什么
利用mysql proxy来实现的。MySQL Proxy最强大的一项功能是实现“读写分离(Read\/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 当然,主服务器也可以提供查询服务。使用读写分离最大的作用无非是...
计梵本悦: 我刚给公司做完mysql的主从读写分离 先给你个思路 第一步:先做mysql的主从(Master/Slave Replication),实现数据同步 第二部:通过Amoeba来实现读写分离,也可以通过mysql proxy(比较麻烦).ps:我的环境是两台装windows server 2008,一台做主,一台做从.如果你需要的话,留下邮箱,我发给你一个我自己刚做好的文档.照着做就可以了
黎川县15283268028: 如何实现mysql读写分离 - ?
计梵本悦: Slave从服务器(Ubuntu) (1)找到MySQL安装文件夹修改my.cnf文件,vim my.cnf s (2) ./support-files/myql.server restart 重启MySQL服务 , ./bin/mysql 进入MySQL命令窗口 (3)连接Master change master to master_host='192.168.0.104', //...
黎川县15283268028: mysql 读写分离 有几种实现方法 - ?
计梵本悦: 利用mysql proxy来实现的. MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”.基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询.数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库.
黎川县15283268028: mysql集群能支持100万的并发请求吗 - ?
计梵本悦: 100万的并发肯定是可以支持的.首先肯定要做主从读写分离,然后就要看你写和读各要分配多少台.mysql cluster不建议你使用,主要还是bug太多了.这些都需要先进行压力测试.业务不同,sql的写入和读取也不同.要根据具体的业务来先压力测试.
黎川县15283268028: 一台服务器,怎么实现数据库的读写分离 - ?
计梵本悦: 方法1 :里面建立两个数据库实例,一个作写,一个作读 方法2:服务器上建两个虚拟机,一个虚拟机放写数据库,一个放读数据库 方法3:服务器上放写数据库,再建一个虚拟机放写数据库 ---------------------- 实现方法: 数据库之间同步,然后修改代码读写分别指向相应的数据库,就可以了.
黎川县15283268028: mysql 读写分离必须是另一台机器吗 - ?
计梵本悦: 读写分离是为了提供程序的性能,随着用户的增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力.主数据库提供写操作,从数据库提供读操作.系统使用缓存后,很大部分功能是不用通过数据库就可以完成的.但是仍然有一部分功能需要和全部的写入操作需要访问数据库.所以要提供主从数据库来分离读写操作,主数据库同步到从数据库后,从数据库一般由多台数据库组成这样才能达到减轻压力的目的
黎川县15283268028: 目前有什么优秀的实现mysql读写分离的方案 - ?
计梵本悦: 很简单,利用SQL自身的同步功能,建2台服务器. A服务器做主数据库,只写 B服务器做从数据库,只读. 然后在程序里面根据读/写情况调用不同数据库即可.
黎川县15283268028: mysql 如何实现读写分离,用mysql - proxy 或者直接用php连接两个数据库? - ?
计梵本悦: Mysql主从配置,实现读写分离 原理:主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接.主从服务器利用...
黎川县15283268028: mysql读写分离原理是什么 - ?
计梵本悦: Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程...
黎川县15283268028: 请问mysql读写分离原理是什么?如果我要实现mysql读写分离,需要怎么操作呢?(如果有具体教程就最好了) - ?
计梵本悦: 在老版本的MySQL 3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎.但是,当出现MyISAM存储引擎之后,也就是从MySQL 3.23开始,MySQL单表最大限制就已经扩大到了64PB了(官方文档显示).也就是...