1.结构思路准备用5个虚机,一个虚机安装nginx来配置负载均衡,两个虚机做web服务器,另外两个虚机,安装mysql,做主主被动配置,每次web只读取一个mysql服务。2.具体实施步骤用vmware最小化安装5个虚机,我用的是centos7,可以克隆。配置两个虚机web服务,我这里用wordpress。架构可以用lamp,也可以用lnmp,我这里用lnmp。注意web连接的mysql不是在本地,启用的是另外一个虚机的mysql。配置虚机的nginx负载均衡。配置两个虚机的mysql主主。测试:负载均衡测试:分别关掉web服务器,看看访问是否正常。mysql主从测试:看看数据是不是同步,两个mysql服务器调换测试。压力测试:暂时没有方案。3.虚机IP信息统计nginx 192.168.211.140nginx_s1 192.168.211.136nginx_s2 192.168.211.137nginx_mysql 192.168.211.138nginx_mysql2 192.168.211.1394.配置nginx_mysql和nginx_mysql2的主主被动模式4.1配置mysql源我这里用mysql5.7,centos默认没有mysql5.7。需要安装mysql源。[root@localhost ~]# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm ##下载源安装包[root@localhost src]# rpm -ivh mysql57-community-release-el7-11.noarch.rpm Preparing... ################################# [100%]Updating / installing... 1:mysql57-community-release-el7-11 ################################# [100%]##安装完成后,见如下,多了mysql的源[root@localhost yum.repos.d]# lsCentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo mysql-community-source.repoCentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo mysql-community.repo4.2用源安装mysqlyum -y install mysql-server mysql-devel4.3mysql基础设置,修改密码设置开机启动 [root@localhost ~]# systemctl start mysqld.service ##启动[root@localhost ~]# systemctl enable mysqld.service ##设置开机启动[root@localhost ~]# systemctl status mysqld.service ##查看状态mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个临时的默认密码。[root@localhost log]# cat mysqld.log |grep password2017-11-15T02:30:48.422591Z 1 [Note] A temporary password is generated for root@localhost: jyjzify=j0sA ##这就是密码2017-11-15T02:32:48.309585Z 3 [Note] Access denied for user 'root'@'localhost' (using password: NO)临时密码登录mysql后,必须先修改root密码,而且密码有规则,必须包含大小写字母数字还有符号,必须8位以上。mysql> alter user 'root'@'localhost' identified by 'Alex2010@';Query OK, 0 rows affected (0.01 sec)4.4配置主主被动模式 配置说明 配置主-主服务器对。 两台服务器有相同的数据 启用二进制日志,选择唯一的ID,并创建复制账号 启用备库更新的日志记录 把被动服务器配置成只读,防止可能与主动服务器上的更新产生冲突。可选。 启动每个服务器的mysql实例。 每个主库设置为对方的备库,使用新创建的二进制日志开始工作。 两个服务器都是新安装的,数据相同。 启动二进制日志,设置唯一的serverid,创建复制账号,如下: [root@localhost var]# cat /etc/my.cnf# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html[mysqld]#log_bin=ON#log_bin_basename=/var/lib/mysql/mysql-bin#log_bin_index=/var/lib/mysql/mysql-bin-indexlog-bin=/var/lib/mysql/logs/mysql-bin ##注意这个路径,这个路径的权限如果不是mysql:mysql,将无法启动mysql.server-id=6 ##两个mysql服务器配置一样,只是server-id不同,另外一个我设置为数字8. 创建复制账号: ##两个mysql都创建mysql> grant replication slave,replication client on *.* to repl@'%' identified by 'Passw0rd!';Query OK, 0 rows affected, 1 warning (0.02 sec) 记录binlog position ##两个mysql的分别记录 等下要用mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 457 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)mysql> 启动复制 change master to master_host='server1', #主库的名字 两个mysql互相写对方的IP master_user='repl', #创建的用户名 master_password='password', #repl的密码 master_log_file='mysql-bin.000001', #记录的position值 master_log_pos=0; #master_log_pos参数设置为0,因为要从日志的开头读起。 执行命令:show slave status #备库执行 检查复制是否正确执行 执行命令:start slave #备库执行,启动开始复制 启动成功 每个mysql都会启动三个线程 mysql> show processlist -> ;+----+-------------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info |+----+-------------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+| 4 | system user | | NULL | Connect | 1006 | Waiting for master to send event | NULL || 5 | system user | | NULL | Connect | 1553 | Slave has read all relay log; waiting for more updates | NULL || 6 | root | localhost | NULL | Query | 0 | starting | show processlist || 7 | repl | 192.168.211.138:41590 | NULL | Binlog Dump | 396 | Master has sent all binlog to slave; waiting for more updates | NULL | 测试 192.168.211.139 : mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || logs || mysql || performance_schema || sys |+--------------------+5 rows in set (0.04 sec)mysql> create database utec;Query OK, 1 row affected (0.01 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || logs || mysql || performance_schema || sys || utec |+--------------------+6 rows in set (0.00 sec) 看看192.168.211.138mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || logs || mysql || performance_schema || sys || utec |+--------------------+6 rows in set (0.00 sec)mysql> 138创建个:mysql> use utec;Database changedmysql> create table t1(i int);Query OK, 0 rows affected (0.04 sec)mysql> show tables;+----------------+| Tables_in_utec |+----------------+| t1 |+----------------+1 row in set (0.00 sec)mysql> 139检查看看:mysql> use utec;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> show tables;+----------------+| Tables_in_utec |+----------------+| t1 |+----------------+1 row in set (0.00 sec)mysql> 主主已经搭建成功。但是这种模式容易出问题,我们如果同时更新数据会冲突。 我们把数据库修改成被动模式,只允许其中一个数据库允许写入数据。 mysql> show variables like '%read_only%';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_read_only | OFF || read_only | OFF || super_read_only | OFF || transaction_read_only | OFF || tx_read_only | OFF |+-----------------------+-------+5 rows in set (0.02 sec)mysql> 对于数据库读写状态,主要靠 “read_only”全局参数来设定;默认情况下,数据库是用于读写操作的,所以read_only参数也是0或faluse状态,这时候不论是本地用户还是远程访问数据库的用户,都可以进行读写操作;如需设置为只读状态,将该read_only参数设置为1或TRUE状态,但设置 read_only=1 状态有两个需要注意的地方: 1.read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过 show slave status\G 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致; 2.read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作;在MySQL中设置read_only=1后,普通的应用用户进行insert、update、delete等会产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有super权限的用户,例如在本地或远程通过root用户登录到数据库,还是可以进行数据变化的DML操作; 为了确保所有用户,包括具有super权限的用户也不能进行读写操作,就需要执行给所有的表加读锁的命令 “flush tables with read lock;”,这样使用具有super权限的用户登录数据库,想要发生数据变化的操作时,也会提示表被锁定不能修改的报错。 这样通过 设置“read_only=1”和“flush tables with read lock;”两条命令,就可以确保数据库处于只读模式,不会发生任何数据改变,在MySQL进行数据库迁移时,限定master主库不能有任何数据变化,就可以通过这种方式来设定。 但同时由于加表锁的命令对数据库表限定非常严格,如果再slave从库上执行这个命令后,slave库可以从master读取binlog日志,但不能够应用日志,slave库不能发生数据改变,当然也不能够实现主从同步了,这时如果使用 “unlock tables;”解除全局的表读锁,slave就会应用从master读取到的binlog日志,继续保证主从库数据库一致同步。 为了保证主从同步可以一直进行,在slave库上要保证具有super权限的root等用户只能在本地登录,不会发生数据变化,其他远程连接的应用用户只按需分配为select,insert,update,delete等权限,保证没有super权限,则只需要将salve设定“read_only=1”模式,即可保证主从同步,又可以实现从库只读。 相对的,设定“read_only=1”只读模式开启的解锁命令为设定“read_only=0”;设定全局锁“flush tables with read lock;”,对应的解锁模式命令为:“unlock tables;”. 当然设定了read_only=1后,所有的select查询操作都是可以正常进行的。 设置:[mysqld]read_only=1#log_bin=ON#log_bin_basename=/var/lib/mysql/mysql-bin#log_bin_index=/var/lib/mysql/mysql-bin-indexlog-bin=/var/lib/mysql/logs/mysql-binserver-id=6 ##在my.cnf [mysqld]下面设定read_only=1即可。 设置好后重启mysql 查看mysql> show variables like '%read_only%';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_read_only | OFF || read_only | ON | ##已经on了。| super_read_only | OFF || transaction_read_only | OFF || tx_read_only | OFF |+-----------------------+-------+5 rows in set (0.03 sec) 测试下,新建个账户,看看能写数据吗,root是可以的,因此要新建账户测试。mysql> grant all privileges on utec.* to 'k'@'%' identified by 'Passw0rd!';Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> 用这个新建的用户分别登录mysql mysql> create table t5(j int);ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement ##139开启了read_onlymysql> 138上执行正常mysql> create table t4(k int);Query OK, 0 rows affected (0.03 sec)mysql> 到此主主被动模式配置成功。 5.配置web,两个web服务器一样配置5.1安装nginx必要软件准备pcre 支持rewrite功能yum –y install pcre*openssl ssl支持yum –y install openssl*tar -zxvf nginx-1.12.1.tar.gz [root@localhost src]# cd nginx-1.12.1[root@localhost nginx-1.12.1]# lsauto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src[root@localhost nginx-1.12.1]# 编译./configure --prefix=/usr/local/nginx-1.12.1 --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre编译完成,执行:make &&make install建立执行文件的link,方便执行命令[root@localhost nginx-1.12.1]# ln -s /usr/local/nginx-1.12.1/sbin/nginx /usr/sbin/nginx启动nginx 执行命令[root@localhost nginx-1.12.1]# nginx检查服务是不是起来了[root@localhost nginx-1.12.1]# ps -ef |grep nginxroot 6329 1 0 03:37 ? 00:00:00 nginx: master process nginxnobody 6330 6329 0 03:37 ? 00:00:00 nginx: worker processroot 6333 2216 0 03:38 pts/0 00:00:00 grep --color=auto nginx[root@localhost nginx-1.12.1]# netstat -antpl |grep nginxtcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6329/nginx: master [root@localhost nginx-1.12.1]# 可以看到服务已经起来5.2安装php先安装安装php必须的软件:yum –y install gd-devl libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel我这边是官网下载的php-7.1.8解压缩tar –zxvf php-7.1.8.tar.gz进入php-7.1.8 编译[root@localhost php-7.1.8]# ./configure --prefix=/usr/local/php-7.1.8 --with-config-file-path=/usr/local/php-7.1.8/etc --with-bz2 --with-curl --enable-ftp --enable-sockets --disable-ipv6 --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-iconv-dir=/usr/local --enable-mbstring --enable-calendar --with-gettext --with-libxml-dir=/usr/local --with-zlib --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --enable-dom --enable-xml --enable-fpm --with-libdir=lib64配置php配置phpcp php.ini-production /usr/local/php-7.1.8/etc/php.inicp /usr/local/php-7.1.8/etc/php-fpm.conf.default /usr/local/php-7.1.8/etc/php-fpm.conf启动php/usr/local/php-7.1.8/sbin/php-fpm如果报错:[15-Aug-2017 13:55:33] WARNING: Nothing matches the include pattern '/usr/local/php-7.1.8/etc/php-fpm.d/*.conf' from /usr/local/php-7.1.8/etc/php-fpm.conf at line 125.[15-Aug-2017 13:55:33] ERROR: No pool defined. at least one pool section must be specified in config file[15-Aug-2017 13:55:33] ERROR: failed to post process the configuration[15-Aug-2017 13:55:33] ERROR: FPM initialization failed/usr/local/php-7.1.8/etc/php-fpm.d把此目录下的www.conf.default改成www.conf然后启动,启动成功。检查下:[root@bogon php-fpm.d]# ps aux |grep phproot 2670 0.0 0.7 216016 3864 ? Ss 01:18 0:00 php-fpm: master process (/usr/local/php-7.1.8/etc/php-fpm.conf)nobody 2671 0.0 0.6 216016 3424 ? S 01:18 0:00 php-fpm: pool wwwnobody 2672 0.0 0.6 216016 3424 ? S 01:18 0:00 php-fpm: pool wwwroot 2674 0.0 0.1 112664 968 pts/0 S+ 01:19 0:00 grep --color=auto php[root@bogon php-fpm.d]# 5.3配置wordpress我们用的数据库不是在本地,是在192.168.211.138须先在mysql建立一个wordpress数据库,和一个存取wordpress数据库的用户mysql> create database wordpress;Query OK, 1 row affected (0.00 sec)mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'Passw0rd!';Query OK, 0 rows affected, 1 warning (0.01 sec)wordpress 路径为 [root@bogon wordpress]# pwd/usr/local/src/wordpress配置下数据库[root@bogon wordpress]# pwd/usr/local/src/wordpress[root@bogon wordpress]# lsindex.php wp-admin wp-config-sample.php wp-links-opml.php wp-settings.phplicense.txt wp-blog-header.php wp-content wp-load.php wp-signup.phpreadme.html wp-comments-post.php wp-cron.php wp-login.php wp-trackback.phpwp-activate.php wp-config.php wp-includes wp-mail.php xmlrpc.php[root@bogon wordpress]# wp-config.php是由wp-config-sample.php复制而来,修改下里面的数据库连接信息5.4设置nginx删除默认页面的server配置,就是第一个server段。加入下面的server { listen 80; index index.php index.html index.htm; access_log logs/wordpress.access.log main; root /usr/local/src/wordpress; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } error_page 404 /404/html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/src/wordpress; } location ~\.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}打开浏览器输入IP,可以访问wordpress了。记录下密码:P@ssword!两个web server都要配置nginx。到这里,已经实现了两个web server共用一个mysql,同时mysql做了主主被动模式的备份。6.配置负载均衡前面我们已经部署了两个web(192.168.211.136 192.168.211.137)现在通过第三台服务器部署nginx,来实现这两台服务器的负载均衡。服务器IP是192.168.211.1406.1解压缩nginx[root@localhost src]# pwd/usr/local/src[root@localhost src]# lshaproxy-1.7.9.tar.gz nginx-1.12.1.tar.gz wordpress-4.8.1-zh_CN.tar.gznginx-1.12.1 php-7.1.8.tar.gz zabbix-2.2.2.tar.gz[root@localhost src]# 6.2编译安装[root@localhost ~]# ./configure --prefix=/usr/local/nginx-1.12.1 --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre[root@localhost ~]# make && make install设置link[root@localhost ~]# ln -s /usr/local/nginx-1.12.1/sbin/nginx /usr/sbin/nginx6.3配置以下是完整参考文件worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;upstream backend { server 192.168.211.136:80; #真实server的IP server 192.168.211.137:80; #真实server的IP}server{ listen 80; server_name 192.168.211.140; #这个是访问用到的域名,我这里没有域名,直接用了nginx设置负载均衡那台服务器的IP location / { proxy_pass http://backend; #backend对应上面upstream proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }}6.4测试配置成功,我们访问配置nginx负载服务器的IP(192.168.211.140),读取的页面就是我们前面配置的那两台web服务器(136,137)的web内容。我们关闭136 137两台服务器的nginx服务,访问192.168.211.140 web无法打开。打开任何一个136 137的nginx服务,访问192.168.211.140 web访问正常。6.5到这里一个基础的架构做出来了。前端是nginx负载均衡,后端是mysql主主被动模式。
nginx负载均衡和mysql主主被动模式基础架构综合部署
发布日期:2021-08-29 20:16:50
浏览次数:6
分类:技术文章
本文共 15574 字,大约阅读时间需要 51 分钟。
转载于:https://blog.51cto.com/goome/1983483
转载地址:https://blog.csdn.net/weixin_34009794/article/details/91500769 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月04日 21时48分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Spring Bean四种注入方式(Springboot环境)
2021-06-30
springboot集成logback日志 通用logback.xml模板详解
2019-04-27
SpringBoot conditional注解和自定义conditional注解使用
2019-04-27
Springboot源码分析之内嵌tomcat源码分析
2019-04-27
SpringBoot源码分析之@Scheduled
2019-04-27
JDK源码分析 NIO实现
2019-04-27
互联网大厂技术面试内幕@霞落满天
2019-04-27
Web框架基准测试
2019-04-27
Linux查看本机端口
2019-04-27
mongodb常用语句以及SpringBoot中使用mongodb
2019-04-27
为什么jdk源码推荐ThreadLocal使用static
2019-04-27
编程容易犯的错
2019-04-27
Spring @bean冲突解决方案
2019-04-27
不写容易出错的代码
2019-04-27
gcc -E 选项
2019-04-27
FastDFS安装与使用
2019-04-27
WEB打印大全
2019-04-27
ASP.Net ViewState的实现
2019-04-27
ASP.NET图象处理详解
2019-04-27
在ASP.NET中值得注意的两个地方
2019-04-27