介绍
Keepalived: v1.2.13
Linux:centos x64 6.8版本
Mycat:1.5.1版本
Mysql:5.6.21版本
nc: 1.84-24
ipvsadm: 1.26-4
jdk:1.8
架构介绍:
四台主机:
Master:192.168.118.128
Slave:192.168.118.129
DBMaster:192.168.118.130
DBSlave:192.168.118.131
虚拟ip:192.168.118.16
端口:8066
流程图:
- Mysql安装
问题1:tar.gz包解压后,进入解压后的文件,执行./scripts/mysql_install_db --user=mysql。提示bash: scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file or directory?
解决方案:貌似提示注释器错误,没有/usr/bin/perl文件或者档案,解决办法(安装perl跟perl-devel即可):
执行 yum -y install perl perl-devel
后在执行./scripts/mysql_install_db --user=mysql初始化数据库即可。
安装Mysql:
查看下是否有系统自带mysql的rpm包,如果有,需要删除自带的旧rpm包。
[root@linuxidc ~]# rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
[root@linuxidc ~]# yum -y remove mysql-libs-5.1*
[root@linuxidc ~]# rpm -qa | grep mysql
[root@linuxidc ~]#
在MySQL官网下载安装MySQL-5.6.21所需的rpm软件包。
需要下载三个rpm软件包:
MySQL-client-5.6.21-1.rhel5.x86_64.rpm
MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
MySQL-server-5.6.21-1.rhel5.x86_64.rpm
[root@linuxidc ~]
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-server-5.6.21-1.rhel5.x86_64.rpm
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-client-5.6.21-1.rhel5.x86_64.rpm
rpm -ivh MySQL-server-5.6.21-1.rhel5.x86_64.rpm
rpm -ivh MySQL-server-5.6.21-1.rhel5.x86_64.rpm
rpm -ivh MySQL-client-5.6.21-1.rhel5.x86_64.rpm
修改配置文件位置。
[root@linuxidc tools]# cp /usr/share/mysql/my-default.cnf /etc/my.cnf
初始化MySQL及修改MySQL默认的root密码。
[root@linuxidc tools]# /usr/bin/mysql_install_db
[root@linuxidc tools]# ps -ef | grep mysql
执行完之后启动 mysql:
Service mysql start;
查询root密码登陆:
more /root/.mysql_secret
# The random password set for the root user at Thu Apr 9 14:43:59 2015 (local time): F6K3v_xggFoLQeiN
[root@linuxidc tools]# mysql -uroot -pF6K3v_xggFoLQeiN
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
修改root密码;
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD(“******”) WHERE user = 'root';
- Mysql主从配置
在mysql主从两台机器上打开vi /etc/my.cnf文件,在mysqld下加一行:
lower_case_table_names = 1
2.1 mysql master
Myql主从复制的搭建:
两台机器192.168.18.130(master) 192.168.118.31(slave)
先从master开始:
- 打开/etc/my.cnf文件(mysql启动默认是从/etc/my.cnf读取的,所以你别的地方有配置文件的话建议直接移到/etc目录下)
- 在[mysqld]下加入配置:
## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
(serverid 全局唯一的
binlog-ignore-db=mysql复制过滤,我们不同步mysql系统自带的数据库
log-bin=master-mysql-bin 开启logbin功能并设置logbin文件的名称
binlog_format=mixed 混合型复制模式,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
接下来重启mysql服务并用客户端登录)
- Slave想要同步master上的数据首先肯定需要权限,所以我们要在master上开通权限。
grant replication slave, replication client on *.* to 'root'@'192.168.118.131' identified by ‘密码’;(不知道这句有没有用,我自己是开启了任何ip都可以链接master的权限,不建议在服务器上这样做)
或者自己开启slave服务器链接master服务器的权限
刷新授权信息,查看master状态:
Flush privileges;
Show master status;
-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| master-mysql-bin.000001 | 1160 | | mysql |
- 在master上创建一个数据库,
我这里直接用的test库,
在库里创建一张表user,
Create table user(
User_id int(10) primary key auto_increment,
User_name varchar(10)
);
随便插入几条数据。
接下来我们把test这个库的数据全部备份下来,
首先我们要锁表,
Flush tables with read lock;
接下来用mysql的备份命令进行备份,(不知道这一步可不可以省略,没试过)
Mysqldump –p3306 –uroot –p –add-drop-table test > /tmp/edu-master.sql
然后把sql文件用xftp发送到slave服务器上
2.2 mysql slave
- Slave的配置:
打开配置文件/etc/my.cnf
在[mysqld]下加入:
## replication
server_id=5
binlog-ignore-db=mysql
log-bin=mysql-slave-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
然后重启mysql:
Service mysql restart
然后创建一下数据库,因为备份下来的数据文件里面是不包含创建数据库命令的,所以要手动创建一下,(这里我用的是test数据库,所以不用自己创建,如果在master上是自己创建的数据库,这里需要在slave上在创建一次,省略)
把从master哪里备份过来的sql文件恢复到slave中
mysql –uroot –p test < /tmp/edu-master.sql
- 登陆slave数据库
在mysql中输入命令链接master:
change master to master_host='192.168.118.130',master_user='root',master_password=”******”,master_port=3306,master_log_file='master-mysql-bin.000001',master_log_pos=1160,master_connect_retry=30;
change
master to
master_host='192.168.118.130' #master主机的ip地址
master_user='root',
master_password=’******’,
我们刚刚在master有执行过授权的账号密码就是这个
master_port=3306,master数据库的端口号
master_log_file= ‘master-mysql-bin.000001', #show master status 看到的
master_log_pos=1160, #这个是我们通过show master status看到的position
master_connect_retry=30;
使用命令查看slave状态,可以看到slave目前还未开始同步
show slave status\G;
执行strat slave 开始主从同步,看到两个Yes就代表成功了。
在master机器上查看状态,可以看见slave的链接信息。
Show processlist\G
最后可以测试一下,在master中插入数据,去slave查看数据是否已经插入。
- Java安装
安装1.7版本java
rpm -ivh jdk-7u80-linux-x64.rpm
安装完成后java –version查看版本,是否安装成功。反正我安装成功了。
OpenJDK Runtime Environment (rhel-2.6.10.1.el6_9-x86_64 u141-b02)
OpenJDK 64-Bit Server VM (build 24.141-b02, mixed mode)
- Mycat安装配置读写分离
将mycat的安装包解压到/usr/local目录下,
cd /usr/local/mycat
ll
设置Mycat的环境变量
Vi /etc/profile
加入两行;
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
使配置文件立即生效,
source /etc/profile
进入mycat配置文件目录:
cd /usr/local/mycat/conf/
vi schema.xml
这个配置文件主要是用来配置数据库节点,逻辑表等等东西的:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- 定义MyCat的逻辑库 -->
<schema name="mycat_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="testNode"></schema>
<!-- 定义MyCat的数据节点 -->
<dataNode name="testNode" dataHost="dtHost" database="test" />
<!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
<!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.118.130:3306" user="root" password="******" >
<readHost host="hostSlave" url="192.168.118.131:3306" user="root" password="******" />
</writeHost>
<writeHost host="hostM2" url="192.168.118.131:3306" user="root" password="******" />
</dataHost>
</mycat:schema>
接下来配置server.xml文件:
vi server.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="root">
<property name="password">******</property>
<property name="schemas">mycat_schema</property>
</user>
</mycat:server>
关闭防火墙:
Service iptables stop
开启Mycat:
Mycat start
用navicat连接Mycat进行查询和新增,mycat默认端口是8066,
查看Mycat.log日志,查看路由是否正确.
注意:mycat.log日志默认是info级别,要在mycat/conf/log4j.xml中修改日志级别为debug之后再看。
- Web服务器上realserver脚本
在web服务器上/etc/init.d下新建realserver脚本(两个都要)。内容如下:
SNS_VIP=192.168.118.16 #虚拟ip(集群虚拟ip要相同)
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
然后service realserver start启动realserver
如果报权限不够,则赋予realserver相应权限:chmod 755 /etc/init.d/realserver
如果访问function被拒绝,则赋予functions相应权限:chmod 755 /etc/rc.d/init.d/functions
- Keepalived安装配置
(keepalived+ipvsadm不是装在mycat+mysql服务器上,准备一个新的服务器,单独放keepalived+ipvsadm)
安装keepalived之前首先安装nc插件。用来对Mycat的8066端口做心跳检测。
直接用rpm -ivh nc-1.84-24.el6.x86_64.rpm安装就可以用。
安装keepalived:(主从负载均衡服务器都要配置)
rpm -ivh keepalived-1.2.13-5.el6_6.x86_64.rpm
配置keepalived.conf:
- global_defs {
- notification_email {
- root@localhost
- }
- notification_email_from root@localhost
- smtp_server localhost
- smtp_connect_timeout 30
- router_id NodeA
- }
默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义(需要验证的原因),我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。
- vrrp_instance VI_1 {
- state MASTER #指定A节点为主节点 备用节点上设置为BACKUP即可
- interface eth0 #绑定虚拟IP的网络接口
- virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
- priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
- advert_int 1 #组播信息发送间隔,两个节点设置必须一样
- authentication { #设置验证信息,两个节点必须一致
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样。
- 192.168.118.16 #测试过程中发现,该虚拟ip只有和真实ip在同一网段,才好用
- #不知道是不是跟我的虚拟机用的nat模式联网有关。
- #测试主机A节点ip为192.168.118.128
- }
- }
按同样的方法配置节点B并修改配置文件,可将A节点的配置文件复制到B节点,并修改以下几项:
router_id NodeB
state BACKUP
priority 90
执行命令 ip a (注意ifconfig命令无法查看到配置的虚拟IP),可以看到节点A已经绑定了192.168.118.16的ip,此时,关闭A的keepalived,在节点B上上执行ip a就发现虚拟IP已经绑定到节点B上,再开启A的keepalived,虚拟IP又绑定回节点A之上。
Keepalived.conf完整配置如下:(两个负载均衡服务器都要配置)
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.118.16
}
}
virtual_server 192.168.118.16 8066 { #虚拟ip
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0 #会话保持时间,x s之内用户无相应则下一次用户请求时重新
#路由
protocol TCP
real_server 192.168.118.130 8066 { #真实服务器1
weight 1
MISC_CHECK {
misc_path "/etc/keepalived/check_mycat_status.sh 192.168.118.130 8066"
misc_timeout 3
}
}
real_server 192.168.118.131 8066 { #真实服务器2
weight 1
MISC_CHECK {
misc_path "/etc/keepalived/check_mycat_status.sh 192.168.118.131 8066"
misc_timeout 3
}
}
}
说明:因为用tcp_check健康检测后面的mycat会报错,所以这里用misc_check的方式做心跳检测,misc_path引号中内容分别是:自定义心跳检测shell脚本的路径、检测的服务器ip、检测的端口。(引号必须要)
Misc_timeout是脚本执行超时时间。
Misc自定义脚本如下:(执行下列脚本必须要安装nc插件)
创建脚本:
vi check_mycat_status.sh
脚本内容:
#!/bin/bash
result=`nc -v -z $1 $2`
flag="succeeded"
if [[ $result =~ $flag ]]
then
exit 0
else;
exit 1
fi
给该脚本赋予执行权限:
Chmod 755 check_mycat_status.sh
- Ipvsadm安装配置
Ipvsadm安装:(两个负载均衡服务器都要配置)
rpm -ivh ipvsadm-1.26-4.el6.x86_64.rpm检查安装是否成功:
Ipvsadm –help
用ipvsadm –L查看Keepalived路由信息。
- 整个流程测试
用navicat链接虚拟ip 192.168.118.16 端口号8066,用户名root,密码******,
通过Keepalived服务器转发到两台数据库服务器的Mycat上,ip地址为192.168.118.130和192.168.118.131,端口号为8066。连上mycat服务器后,通过mycat对master数据库进行写,对slave数据库进行读操作。Master的数据会更新到slave数据库。
Mysql的安装的主从复制的配置,
双点Mycat读写分离的安装配置
分流服务器主从Keepalived+ipvsadm的安装、配置和数据库服务器realserver脚本的编写