1、网络拓扑、地址规划。php
硬件防火墙:用一台机器的iptables模拟,公有IP:1.1.1.1 私有IP:192.168.1.24html
交换机就省略了,都是同一个网段没事,再说VMworkstation的虚拟机都是桥接到虚拟交换机的。前端
虚拟IP:192.168.1.10node
机器 | IP地址 |
LVS主 | 192.168.1.22 |
LVS备 | 192.168.1.23 |
硬件防火墙(iptables替代) | 192.168.1.24 |
Nginx1/salt-minion | 192.168.1.25 |
Nginx2/salt-minion | 192.168.1.26 |
NFS | 192.168.1.27 |
Rsync | 192.168.1.28 |
Zabbix/salt-master | 192.168.1.20 |
Mysql主 | 192.168.1.30 |
Mysql备 | 192.168.1.31 |
2、LVS+keepalived实现访问Nginx。mysql
一、LVS主:192.168.1.22,LVS备:192.168.1.23 。linux
[root@lvs-backup ~]# yum install ipvsadm keepalived -y ##yum安装算了,源码包安装太容易报错,yum源选择centos7官方源便可nginx
[root@lvs-backup ~]# cd /etc/keepalived/c++
[root@lvs-backup keepalived]# cp keepalived.conf keepalived.conf.defaultweb
[root@lvs-backup keepalived]# echo >keepalived.conf
[root@lvs-backup keepalived]# vim keepalived.conf面试
! Configuration File for keepalived global_defs { notification_email { root@localhost ## } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 ## smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP ## interface eth0 virtual_router_id 51 priority 99 ## advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.10 } } virtual_server 192.168.1.10 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.1.25 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.1.26 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
Note: LVS主跟上述步骤同样,直接拷贝过来便可,只须要把state改成Master,Proiority改成100
2、现学现用,利用Saltstack部署真实服务器Nginx1:192.168.1.25 ,Nginx2 :192.168.1.26。Nginx1和Nginx2做为salt-minion,选择Zabbix机器做为salt-master
[root@nginx-01 ~]# yum install salt-minion -y
[root@nginx-01 ~]# vim /etc/salt/minion
master: salt ##发现写成IP的形式不会成功。
id:nginx-192.168.1.25 ##指定Minion-id
[root@nginx-01 ~]# echo "192.168.1.20 salt" >>/etc/hosts ##必须配域名解析才行
[root@nginx-01 ~]# systemctl start salt-minion
[root@salt-master ~]# salt-key -A -y
[root@salt-master ~]# salt-key -L
Accepted Keys:
nginx-01
nginx-02
Denied Keys:
Unaccepted Keys:
Rejected Keys:
参考saltstack推送nginx文档:http://xiaoluoge.blog.51cto.com/9141967/1722289/
##保证两台nginx的80端口正常开放
[root@nginx-02 nginx]# ss -tunlp|grep 80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=22474,fd=6),("nginx",pid=22390,fd=6))
[root@nginx-01 nginx]# bash lvs_dr.sh ##在2台真实服务器上均作
#!/bin/bash VIP=192.168.1.10 . /etc/rc.d/init.d/functions case $1 in start) ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up #设置广播为自已,掩码4个255,表示网络中只有自已自己一个主机 /sbin/route add -host $VIP dev lo:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore ##拒绝发出ARP应答 echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce ##拒绝发出ARP请求 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >&/dev/null ;; stop) ifconfig lo:0 down route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore ##启用ARP应答 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce ##容许发出ARP请求 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage:$0 {start|stop}" exit 1 esac exit 0
[root@lvs-master keepalived]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@lvs-backup keepalived]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@lvs-master keepalived]# servce keepalived start
[root@lvs-master keepalived]# ipvsadm -L -n
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.10:80 rr persistent 50
-> 192.168.1.25:80 Route 1 1 2
-> 192.168.1.26:80 Route 1 0 0
##lvs的负载均衡暂告段落,当停掉lvs主的时候,lvs备赋予了虚拟IP,当lvs主恢复过来的时候,虚拟IP又回到了lvs主上,这是由于咱们默认非抢占模式
3、搭建NFS服务器,并共享给nginx01和nginx02,并提供写权限,让nginx01上传的附件能够在nginx02看到。
[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# vim /etc/exports
/nfs/web 192.168.1.0/24(rw,sync,all_squash)
[root@nfs ~]# service rpcbind status
[root@nfs ~]# service nfs start
[root@nfs ~]# showmount -e localhost ##exportfs -arv 从新导出命令
Export list for localhost:
/nfs/web 192.168.1.0/24
[root@nfs ~]# systemctl enable nfs
在nginx01和nginx02上:
[root@nfs web]# chown -R nfsnobody.nfsnobody /nfs/web ##属于匿名权限,客户端才能写入文件
[root@nginx-02 ~]# yum install -y showmount
[root@nginx-02 ~]# showmount -e 192.168.1.27
Export list for 192.168.1.27:
/nfs/web 192.168.1.0/24
[root@nginx-02 ~]# mount -t nfs 192.168.1.27:/nfs/web /usr/local/nginx/html/
[root@nginx-02 ~]# mount|grep nfs
192.168.1.27:/nfs/web on /usr/local/nginx/html type nfs4 (rw,relatime,vers=4.0,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.26,local_lock=none,addr=192.168.1.27)
[root@nginx-02 ~]# cd /usr/local/nginx/html/
[root@nginx-02 html]# touch 1.txt
[root@nfs ~]# cd /nfs/web/
[root@nfs web]# ls ##NFS服务器查看共享
1.txt
[root@nginx-01 html]# pwd ##nginx其余节点查看共享。
/usr/local/nginx/html
[root@nginx-02 html]# ls
1.txt
[root@nginx-02 nginx]# umount /usr/local/nginx/html/ ##取消挂载在一个根目录,而是在当前目录下专门建立一个附件目录
[root@nginx-01 nginx]# mkdir /usr/local/nginx/html/fuJian
[root@nginx-01 nginx]# mount -t nfs 192.168.1.27:/nfs/web /usr/local/nginx/html/fuJian/
4、搭建Rsync服务器。
## NFS服务器部署inotify,一触即发同步到rsync服务端。
[root@nfs ~]# ll /proc/sys/fs/inotify/
[root@nfs ~]# tar xf inotify-tools-3.14.tar.gz
[root@nfs ~]# cd inotify-tools-3.14/
[root@nfs inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-3.14
[root@nfs inotify-tools-3.14]# make && make install
##部署rsync备份服务器。
[root@rsync ~]# tar xf rsync-3.1.2.tar.gz
[root@rsync ~]# cd rsync-3.1.2/
[root@rsync rsync-3.1.2]# ./configure --prefix=/usr/local/rsync
[root@rsync rsync-3.1.2]# make && make install
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid #设置pid文件位置
lock file = /var/run/rsyncd.lock #设置lock文件位置
uid = body #设置启动时以哪一个用户来代替root运行rsync
gid = nobody
list = yes #不容许列出名单
chroot = no #不切换根目录
timeout = 300 #设置超时时间
ignore errors = yes #是否忽略错误
max connections = 100 #最大链接数
hosts allow = 192.168.1.0/24
[backup] #设定模块名称
path = /root/backup/nfs/ #指定模块路径
read only = no #是否可写
auth users = rsync #建立容许链接该模块的虚拟用户
secrets file = /usr/local/rsync/rsyncd.passwd
##安装MySQL
一、[root@www ~]# yum install mysql-server mysql-devel
主:vi /etc/my.cnf
server-id=1
log-bin=binlog
[root@www ~]# service mysqld restart
[root@www ~]# mysql -uroot -p
##mysqladmin -uroot -p password 199510 设置初始化密码
mysql> grant replication slave on *.* to 'root'@'192.168.1.4' identified by '199510';
##admin是虚拟用户,192.168.1.4是从机器的IP地址,能够从机器上登录测试 [root@www ~]# mysql -uadmin -p199510 -h 192.168.1.3
mysql> show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000001 | 338 | | |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
二、从机器不须要开启binlog: vi /etc/my.cnf
==============
server-id=2
read_only=1
================
[root@www ~]# service mysqld restart
mysql> stop slave;
mysql> change master to master_host='192.168.1.3',master_user='root',master_password='199510',master_log_file='mysql- binlog.000001 ',master_log_pos=338;
mysql>start slave;
三、主:mysql>create database d1;
mysql>use d1;
mysql>create table t1(id int primary key auto_increment,name varchar(10));
一、检查主从复制是否正常?
在master上面检查受权,msyql>show grants;
主库加锁FLUSH TABLES WITH READ LOCK;主库解锁:unlock tables;
stop slave;
set global sql_slave_skip_counter=1; (1是指跳过一个错误)
slave start;
误操做:revoke all privileges on *.* from 'root'@'localhost',误操做给root取消受权,致使任何命令都没法执行,再进行grant都不行。我日尼玛呀!幸好是测试环境。
二、mysql-proxy的安装
[root@www Packages]# tar xf mysql-proxy-0.8.5-linux-el6-x86-32bit.tar.gz
[root@www Packages]# mv mysql-proxy-0.8.5-linux-el6-x86-32bit /usr/local/mysql-proxy
[root@www Packages]# cd /usr/local/mysql-proxy/
[root@www mysql-proxy]# mkdir lua logs
[root@www mysql-proxy]#cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件
[root@www mysql-proxy]#useradd -s /sbin/nologin -M mysql-proxy
[root@www mysql-proxy]# chown -R root:mysql-proxy /usr/local/mysql-proxy/*
三、安装Lua软件
[root@www Packages]#yum install libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ autoconf mysql-devel pkgconfig libtool ##若是不作这个,安装lua会报错不断
[root@www Packages]# tar xf lua-5.1.4.tar.gz
[root@www Packages]# cd lua-5.1.4
[root@www Packages]# make linux
[root@www Packages]# make install
四、配置SysV启动脚本,vi /etc/init.d/mysql-proxy,该脚本会自动读取/etc/sysconfig/mysql-proxy
=====================================================
#!/bin/bash
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon for mysql
# Source function library.
. /etc/rc.d/init.d/functions
prog="/usr/local/mysql-proxy/bin/mysql-proxy"
# Source networking configuration.
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Set default mysql-proxy configuration.
ADMIN_USER="admin"
ADMIN_PASSWD="admin"
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_OPTIONS="--daemon"
PROXY_PID=/var/run/mysql-proxy.pid
PROXY_USER="mysql-proxy"
# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
. /etc/sysconfig/mysql-proxy
fi
RETVAL=0
start() {
echo -n $"Starting $prog: "
daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD"
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/mysql-proxy
fi
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $PROXY_PID -d 3 $prog
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f /var/lock/subsys/mysql-proxy
rm -f $PROXY_PID
fi
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
condrestart|try-restart)
if status -p $PROXY_PIDFILE $prog >&/dev/null; then
stop
start
fi
;;
status)
status -p $PROXY_PID $prog
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"
RETVAL=1
;;
esac
exit $RETVAL
=======================================================
[root@www mysql-proxy]# chmod +x /etc/init.d/mysql-proxy
[root@www mysql-proxy]# chkconfig --add mysql-proxy
五、配置mysql-proxy的配置选项
============================================
# Options for mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD="admin"
ADMIN_ADDRESS="192.168.186.5:4041"
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/lua/admin.lua"
PROXY_ADDRESS="192.168.186.5:4040"
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--daemon --log-level=info --log-file=/var/log/mysql-proxy.log --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.186.3:3306 --proxy-read-only-backend-addresses=192.168.186.4:3306 --proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua
============================================
六、编写Lua脚本
(1)读写分离脚本
[root@www mysql-proxy]# vi /usr/local/mysql-proxy/lua/rw-splitting.lua
=======================================
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1,
##当链接没有超过min_idle_connections预设值时,不会进行读写分离,即查询操做会发生到主库上。
max_idle_connections = 2, ##默认是8,主从机器共有几台
is_debug = false
}
end
========================================
(2)管理员脚本
[root@www mysql-proxy]# vi /usr/local/mysql-proxy/lua/admin.lua
=============================================
function set_error(errmsg)
proxy.response = {
type = proxy.MYSQLD_PACKET_ERR,
errmsg = errmsg or "error"
}
end
function read_query(packet)
if packet:byte() ~= proxy.COM_QUERY then
set_error("[admin] we only handle text-based queries (COM_QUERY)")
return proxy.PROXY_SEND_RESULT
end
local query = packet:sub(2)
local rows = { }
local fields = { }
if query:lower() == "select * from backends" then
fields = {
{ name = "backend_ndx",
type = proxy.MYSQL_TYPE_LONG },
{ name = "address",
type = proxy.MYSQL_TYPE_STRING },
{ name = "state",
type = proxy.MYSQL_TYPE_STRING },
{ name = "type",
type = proxy.MYSQL_TYPE_STRING },
{ name = "uuid",
type = proxy.MYSQL_TYPE_STRING },
{ name = "connected_clients",
type = proxy.MYSQL_TYPE_LONG },
}
for i = 1, #proxy.global.backends do
local states = {
"unknown",
"up",
"down"
}
local types = {
"unknown",
"rw",
"ro"
}
local b = proxy.global.backends[i]
rows[#rows + 1] = {
i,
b.dst.name, -- configured backend address
states[b.state + 1], -- the C-id is pushed down starting at 0
types[b.type + 1], -- the C-id is pushed down starting at 0
b.uuid, -- the MySQL Server's UUID if it is managed
b.connected_clients -- currently connected clients
}
end
elseif query:lower() == "select * from help" then
fields = {
{ name = "command",
type = proxy.MYSQL_TYPE_STRING },
{ name = "description",
type = proxy.MYSQL_TYPE_STRING },
}
rows[#rows + 1] = { "SELECT * FROM help", "shows this help" }
rows[#rows + 1] = { "SELECT * FROM backends", "lists the backends and their state" }
else
set_error("use 'SELECT * FROM help' to see the supported commands")
return proxy.PROXY_SEND_RESULT
end
proxy.response = {
type = proxy.MYSQLD_PACKET_OK,
resultset = {
fields = fields,
rows = rows
}
}
return proxy.PROXY_SEND_RESULT
end
=============================================
五、(1)启动mysql-proxy
[root@www mysql-proxy]#service mysql-proxy start
netstat -tupln | grep 4040 #发现无任何现象,mysql-proxy启动不成功,咋回事呢?
{
杀死相应的PID文件便可,好比/var/run/mysql-proxy.pid
}
在代理机器上面:[root@www lua]# netstat -tnlp
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 8026/mysql-proxy
能够看到4041端口,那么其实这是管理端口。对应的管理员的用户和密码参见/etc/sysconfig/mysql-proxy
(2)修改path环境变量
[root@proxy ~]# vim /etc/profile.d/mysql-proxy.sh
export PATH=$PATH:/usr/local/mysql-proxy/bin
[root@proxy ~]# source /etc/profile
[root@proxy ~]# mysql-proxy --help-all
六、排错
(2)很好奇mysql-proxy的日志在哪,一看进程,原来是在系统日志里面
[root@www lua]# ps -aux|grep mysql-proxy
/usr/local/mysql-proxy/libexec/mysql-proxy --daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.186.3:3306 --proxy-read-only-backend-addresses=192.168.186.4:3306 --proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua --pid-file=/var/run/mysql-proxy.pid --proxy-address=192.168.186.5:4040 --user=mysql-proxy --admin-username=admin --admin-lua-script=/usr/local/mysql-proxy/lua/admin.lua --admin-password=admin
能够在/etc/sysconfig/mysql-proxy中改动--log-file=/var/log/mysql-proxy.log
(3)登录到Mysql-proxy的4041管理端口,又报错,初步分析是/usr/local/mysql-proxy/lua/admin.lua脚本有错,查看系统日志,果真,看来必须更换admin.lua
任意客户端登录便可[root@www libexec]# mysql -uadmin -padmin -h192.168.186.5 -P4041
mysql> select * from backends;
ERROR 1105 (07000): MySQL Proxy Lua script failed to load. Check the error log.
[root@www lua]# tail /var/log/mysql-proxy.log ##这个日志是在/etc/sysconfig/mysql-proxy.log指定的
network-mysqld-lua.c:234: lua_load_file(/usr/local/mysql-proxy/lua/admin.lua) failed: lua-scope.c:241: stat(/usr/local/mysql-proxy/lua/admin.lua) failed: No such file or directory (2)
分析:说了没有这样的文件,你看嘛,结果是文件命名出错了,真尼玛笨呐
{
[root@www lua]# pwd
/usr/local/mysql-proxy/lua
[root@www lua]# ls
admin-sql.lua admin-sql.lua.51cto admin-sql.lua.bak rw-splitting.lua
[root@www lua]# mv admin-sql.lua admin.lua
}
mysql-proxy服务器不用重启,直接在客户端好比slave登录,mysql -uadmin -padmin -h192.168.186.5 -P4041
mysql> select * from backends;
+-------------+--------------------+---------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+--------------------+---------+------+------+-------------------+
| 1 | 192.168.186.3:3306 | unknown | rw | NULL | 0 |
| 2 | 192.168.186.4:3306 | unknown | ro | NULL | 0 |
+-------------+--------------------+---------+------+------+-------------------+
七、问题解决,测试。
(1)在主机器上:mysql> grant all on *.* to 'mysql-proxy'@'192.168.186.5' identified by '199510';
##给mysql-proxy客户端能在192.168.186.5的这台机器上登录master机器的权限
master上面:mysql> select user,host from mysql.user;
+-------------+---------------+
| user | host |
+-------------+---------------+
| root | 127.0.0.1 |
| mysql-proxy | 192.168.186.5 |
+-------------+---------------+
##这才是真正有意义查看受权的
(2)从机器上:mysql> stop slave; ##停掉从库,否则数据写入到master上的时候,会复制到从机器上,影响测试
(3)代理机器上,安装mysql,yum install mysql-server,可是在这里下载mysql的缘由是,仅仅做为前端客户端进行测试。
[root@www lua]# mysql -umysql-proxy -p199510 -h192.168.186.5 -P4040 ##登陆的是代理服务器的4040的端口,可是请求被跳转到master机器上
mysql>use test;
mysql>insert into t1 values(5,'one');
在主机器上:select * from test.t1;能够看到数据,可是在从机器上看不到,由于已经关闭了复制。
(4)在从机器上,mysql -uadmin -padmin -h192.168.186.5 -P4041 只要客户端已登陆到代理服务器,便能知晓状态
mysql> select * from backends;
+-------------+--------------------+---------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+--------------------+---------+------+------+-------------------+
| 1 | 192.168.186.3:3306 | up | rw | NULL | 0 |
| 2 | 192.168.186.4:3306 | unknown | ro | NULL | 0 |
+-------------+--------------------+---------+------+------+-------------------+
2 rows in set (0.01 sec)
八、完结测试
(1)启动salve,在从机器上再开一个终端,start slave;
(2)如今有4个终端,一个是在代理服务器上面的4040端口客户端(只有这个是须要主从都受权的,记住是都要,grant all on *.* to 'msyql-proxy'@'192.168.186.5' idientified by '199510'),
[root@www mysql-proxy]# mysql -umysql-proxy -p199510 -h192.168.186.5 -P4040,
##代理服务器自己是须要mysql服务的,可是这里因为机器少缘由,选择的测试客户端,不信再开一台机器。
mysql>use test;
mysql> insert into t1 values(4,'two');
(3)一个是在slave机器上登录的4041管理端口,mysql -uadmin -padmin -h192.168.186.5 -P4041
mysql> select * from backends;
+-------------+--------------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+--------------------+-------+------+------+-------------------+
| 1 | 192.168.186.3:3306 | up | rw | NULL | 1 |
| 2 | 192.168.186.4:3306 | up | ro | NULL | 0 |
+-------------+--------------------+-------+------+------+-------------------+
2 rows in set (0.01 sec)
都变为up up 了
(3)一个是主机器。
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | y |
| 2 | h |
| 3 | c |
| 5 | one |
| 4 | two |
+----+------+
5 rows in set (0.00 sec)
(4)一个是从机器,主从一致。
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | y |
| 2 | h |
| 3 | c |
| 5 | one |
| 4 | two |
+----+------+
5 rows in set (0.00 sec)
九、总结:
太不容易了,一直报错啊,不管是主从复制仍是读写分离。怎么给面试官讲述测试效果呢?
(1)使用任意一台客户端,登录mysql-proxy代理服务器的4041管理端口,select * from backends;查看主从机器状态;
(2)而后再使用任意一台客户端,登录mysql-proxy代理服务器的4040读写分离端口,再进行插入表数据,然后,分别在主从机器
上,查看是否有对应的数据,而且保持一致的功能。
(3)最后,重复(1)步骤,登录到4041管理端口,观察主从机器状态是否发生了变化,好比Up Up转态
7、部署Zabbix监控
abbix—server服务器:zabbix-web gui(LAMP环境)、zabbix-datatabase(mysql、oracle)、zabbix-server软件,其中三种元素能够分离式部署在不一样机器上面。同时,能够监控本身,也能够安装agent。
zabbix-proxy服务器(可选):有本身独立proxy.conf和proxy.log以实现分布式监控的前提。
zabbix-agent服务器:有本身的数据库,zabbix-sender向zabbix-server发送报告,也有本身agent.log和agent.conf配置文件。
zabbix具备自动发现被监控主机功能。zabbix产生的数据只要有四部分:
配置数据、历史数据、历史数据、历史趋势数据
一、Zabbix部署LAMP环境。
源码包安装官网文档: https://www.zabbix.com/documentation/3.2/manual/installation/install
(1)安装受权mysql数据库
[root@zabbix ]# //yum install mysql-server mysql-devel;
===============================================
报错现象:
Error: MariaDB-common conflicts with 1:mariadb-libs-5.5.52-1.el7.x86_64
Error: Package: 1:mariadb-devel-5.5.52-1.el7.x86_64 (base)
Requires: mariadb-libs(x86-64) = 1:5.5.52-1.el7
Installed: MariaDB-shared-10.0.25-1.el7.centos.x86_64 (@Centos7)
mariadb-libs(x86-64) = 1:10.0.25-1.el7.centos
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
分析:试试不安装Mysql-devel如何?没有Mysql-server,应该安装mariadb-server{依然报错}
安装包发生冲突,必须先移走一些包
解决:[root@zabbix ]# yum remove mariadb-libs MariaDB-common
##再尝试安装数据库
[root@zabbix ]# yum install mariadb-devel mariadb-server
==================================================================
[root@zabbix ~]# systemctl enable mariadb.service ##注意启动的时候是service而不是server
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@zabbix ~]# systemctl start mariadb.service
[root@zabbix ]# mysql
MariaDB [(none)]> create datatabase zabbix default charset utf8;
MariaDB [(none)]> grant all on zabbix.* to 'zabbix'@'192.168.%.%' identified by 'zabbix'; ##在受权的同时建立了该用户
MariaDB [(none)]> grant all on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix'; ##使用socket链接,由于数据库也在同一台机器上
MariaDB [(none)]> flush privileges;
[root@zabbix ~]# mysql -uzabbix -p ##测试登陆
Enter password:
[root@zabbix mariadb]# yum install httpd httpd-devel httpd-manual -y
[root@zabbix httpd]# cat /var/www/html/index.html
<h1>
this is Zabbix Server,and IP is 192.168.0.24
</h1>
[root@zabbix httpd]# service httpd start
(2)配置zabbix的yum仓库,指明一个baseurl便可,以便为了下载软件方便。
[root@zabbix yum.repos.d]# //cat zabbix.repo
[zabbix]
name=zabbix-repo
baseurl=http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@zabbix yum.repos.d]# yum list|grep zabbix
[root@zabbix yum.repos.d]# yum install zabbix-server zabbix-server-mysql zabbix-get zabbix zabbix-web zabbix-web-mysql zabbix-agent zabbix-sender
=======================================================================================
报错现象:
Transaction check error:
file /etc/zabbix/zabbix_agentd.conf conflicts between attempted installs of zabbix22-2.2.16-1.el7.x86_64 and zabbix-agent-3.2.3-1.el7.x86_64
file /usr/bin/zabbix_sender conflicts between attempted installs of zabbix22-2.2.16-1.el7.x86_64 and zabbix-sender-3.2.3-1.el7.x86_64
file /usr/share/man/man1/zabbix_sender.1.gz conflicts between attempted installs of zabbix22-2.2.16-1.el7.x86_64 and zabbix-sender-3.2.3-1.el7.x86_64
file /usr/bin/zabbix_get conflicts between attempted installs of zabbix-get-3.2.3-1.el7.x86_64 and zabbix22-2.2.16-1.el7.x86_64
file /usr/share/man/man1/zabbix_get.1.gz conflicts between attempted installs of zabbix-get-3.2.3-1.el7.x86_64 and zabbix22-2.2.16-1.el7.x86_64
Error Summary
解决:从新更换zabbix的Yum源,在次基础上禁用epel源,由于epel源中也有个zabbix的落后版本
[root@zabbix ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
====================================================================================================
导入数据库的表结构,注意顺序,首先是scheme>image>data,可是在3.2版本当中,只有一个create.sql.gz
[root@zabbix doc]# rpm -ql zabbix-server-mysql
[root@zabbix ~]# cd /usr/share/doc/zabbix-server-mysql-3.2.3/
[root@zabbix ~]# gunzip create.sql.gz
[root@zabbix ~]# mysql zabbix <create.sql ##默认root密码为空
[root@zabbix zabbix-server-mysql-3.2.3]# mysql
MariaDB [(none)]> use zabbix;
MariaDB [zabbix]> show tables;
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
## DBHost=zabbix ##若是指定为localhost的意思是,数据库也在本机上,那么咱们是不须要修改接下来的DBsocket的
DBPassword=zabbix
[root@zabbix ~]# service zabbix-server start
[root@zabbix ~]# systemctl enable zabbix-server
[root@zabbix ~]# netstat -tunlp ##并无察觉到10051端口处于监听状态
=========================================================
查看日志:[root@zabbix ~]# vim /var/log/zabbix/zabbix-server.log/
3660:20170123:000150.258 [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'zabbix' (using password: YES)
3660:20170123:000150.258 cannot set MySQL character set to "utf8"
3660:20170123:000150.259 database is down: reconnecting in 10 seconds
解决:以前在zabbix_server.conf中指明DBHost=zabbix是不正确的,依然改成DBHost=localhost,由于能够登陆到数据库中,mysql -uzabbix -pzabbix ;
show grants查看明显没有对zabbix的这个域名进行受权。
======================================================================
[root@zabbix ~]# vim /etc/php.ini ##
date.timezone =Asia/Shanghai
[root@zabbix ~]# vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai
[root@zabbix httpd]# service httpd start
[root@zabbix httpd]# systemctl enable httpd ##默认PHP已经安装了,不知道何时安装的
在浏览器进行访问zabbix的web界面,http://zabbix-IP/zabbix便可。登陆的用户名是admin,密码是zabbix
========================================================
报错:web界面依然提示,Access denied for user 'zabbix'@'zabbix' (using password: YES)
分析:奇了怪了,明明已经改了DBHost,为何仍是不能访问。查看mysql的日志。 依然不行
最后在web界面把Database host由IP地址改成了localhost终于成功了。
==================================================================
(3)是zabbix server监控本身,即把本身做为一个agent。
[root@zabbix ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1,192.168.0.24 ##此选项用于受权以便为了容许让哪一个监控端来此获取数据。
ServerActive=127.0.0.1,192.168.0.24 ##此选项用于向哪一个监控端去报告数据,不要把127.0.0.1删了,由于当前既是server又是agent。对于
agent来讲,是主动关系,因此是active,从而,上面的server选项是被动关系。
Hostname=zabbix ##指明zabbix被监控端的域名,它是在zabbix的web界面进行显示的, 由于有多个agent,因此域名必须全局惟一
[root@zabbix ~]# service zabbix-agent start
[root@zabbix ~]# systemctl enable zabbix-agent
[root@zabbix ~]# netstat -tnlp|grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 4939/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 4939/zabbix_agentd
然后,在web界面的[configuration]-[host]便可看到新增长的被监控端,初始是disabled,改成enable host
若是是在分离式主机添加一个agent,那么必须手动在web界面的[configuration]-[host]-create host
能够在[Monitoring]-[Screen]查看多个监控指标的图形状况。
[root@zabbix ~]# netstat -tnulp|awk ' /^tcp/ { a[$NF]++ } END{ for (i in a) {print a[i],i} } '
2 1708/zabbix_server
2 1071/sshd
1 1076/httpd
2 3490/zabbix_agentd
1 2139/mysqld
(4)开启另外一台被监控主机
[root@agent yum.repos.d]# yum install zabbix-agent zabiix-sender -y ##centos7.2中不须要安装zabbix公共组件
[root@agent ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.8.24 ##申明zabbix监控端的IP地址或者域名
ServerActive=192.168.8.24
Hostname=agent.node1 ##申明被监控端的主机名,必须惟一
[root@agent ~]# service zabbix-agent start
[root@agent ~]# systemctl enable zabbix-agent
[root@agent ~]# netstat -tnulp|grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 3166/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 3166/zabbix_agentd
然后,登陆web界面,在[configuration]-[host]右侧建立主机[create host],填入
{
Hostname 192.168.8.23
Visable Name agent.node1
Agent Interface 192.168.8.23 ##依 然填被监控端的IP地址,表示使用zabbix-agent的报告机制完成监控的状况。
Monitor by proxy (no proxy) ##不要启用Proxy代理
Enabled ##打钩。
基本步骤完毕,右侧其余选项能够添加,也能够不添加。
}
最后,nginx部署wordpress论坛来进行测试。