首页 文章 精选 留言 我的

精选列表

搜索[主从同步],共10003篇文章
优秀的个人博客,低调大师

主从DNS配置流程示例

实验环境:主服务器A:10.1.1.6 从服务器B:10.1.1.5 1.安装DNS域名解析服务 #yum install bind-* -y 2.主服务器A配置: #vim /var/named/chroot/etc/named.conf options { directory "/var/named"; allow-recursion {10.1.1.5/24; }; }; #zone "." IN { # type hint; # file "named.ca"; #}; #zone "localost" IN { # type master; # file "named.localhost"; # allow-transfer {none; }; #}; #zone "0.0.127.in-addr.arpa" IN { # type master; # file "named.loopback"; # allow-transfer {none; }; #}; zone "swht.com" IN { type master; file "swht.com.zone"; # masters {10.1.1.6; }; allow-transfer {10.1.1.5; }; }; zone "1.1.10.in-addr.arpa" IN { type master; file "10.1.1.zone"; allow-transfer {10.1.1.5; }; }; #chmod 640 /var/named/chroot/etc/named.conf 修改文件的权限 #chown root:named /var/named/chroot/etc/named.conf 修改文件的属组 #vim /var/named/chroot/var/named/swht.com.zone $TTL 600 @ IN SOA master.swht.com. root ( 2014091901 1H 5M 2D 6H) IN NS master IN MX 10 mail master IN A 10.1.1.6 mail IN A 10.1.1.6 www IN A 10.1.1.6 ftp IN CNAME www #chmod 640 /var/named/chroot/var/named/swht.com.zone #chown root:named /var/named/chroot/var/named/swht.com.zone #vim /var/named/chroot/var/named/10.1.1.zone $TTL 600 @ IN SOA master.swht.com. root ( 2014091901 1H 5M 2D 6H) IN NS master 6 IN PTR master 6 IN PTR mail 6 IN PTR www 6 IN PTR ftp #chmod 640 /var/named/chroot/var/named/10.1.1.zone #chown root:named /var/named/chroot/var/named/10.1.1.zone #service named restart 3.从服务器B配置: #vim /var/named/chroot/etc/named.conf options { directory "/var/named"; allow-recursion {10.1.1.6/26; }; notify yes; }; #zone "." IN { # type hint; # file "named.ca"; #}; #zone "localost" IN { # type master; # file "named.localhost"; # allow-transfer {none; }; #}; #zone "0.0.127.in-addr.arpa" IN { # type master; # file "named.loopback"; # allow-transfer {none; }; #}; zone "swht.com" IN { type slave; file "slaves/swht.com.zone"; masters {10.1.1.6; }; }; zone "1.1.10.in-addr.arpa" IN { type slave; file "slaves/10.1.1.zone"; masters {10.1.1.6; }; }; #chmod 640 /var/named/chroot/etc/named.conf #chown root:named /var/named/chroot/etc/named.conf #service named restart 4.验证: #dig -t NS www.swht.com #host 10.1.1.6 #cd /var/named/chroot/var/named/slaves #ls 10.1.1.zone swht.com.zone #vim 10.1.1.zone $ORIGIN . $TTL 600 ; 10 minutes 1.1.10.in-addr.arpa IN SOA master.swht.com. root.1.1.10.in-addr.arpa. ( 2014091901 ; serial 3600 ; refresh (1 hour) 300 ; retry (5 minutes) 172800 ; expire (2 days) 21600 ; minimum (6 hours) ) NS master.1.1.10.in-addr.arpa. $ORIGIN 1.1.10.in-addr.arpa. 6 PTR ftp PTR www PTR mail PTR master #vim swht.com.zone $ORIGIN . $TTL 600 ; 10 minutes swht.com IN SOA master.swht.com. root.swht.com. ( 2014091901 ; serial 3600 ; refresh (1 hour) 300 ; retry (5 minutes) 172800 ; expire (2 days) 21600 ; minimum (6 hours) ) NS master.swht.com. MX 10 mail.swht.com. $ORIGIN swht.com. ftp CNAME www mail A 10.1.1.6 master A 10.1.1.6 www A 10.1.1.6 波波整理~^_^ 本文转自 南非波波 51CTO博客,原文链接:http://blog.51cto.com/nanfeibobo/1556316,如需转载请自行联系原作者

优秀的个人博客,低调大师

Redis主从实现读写分离

前言 大家在工作中可能会遇到这样的需求,即Redis读写分离,目的是为了压力分散化。下面我将为大家介绍借助AWS的ELB实现读写分离,以写主读从为例。 实现 引用库文件 <!--redis客户端--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> </dependency> 方式一,借助切面 JedisPoolSelector 此类的目的是为读和写分别配置不同的注解,用来区分是主还是从。 packagecom.silence.spring.redis.readwriteseparation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/** *Createdbykeysilenceon16/10/26. */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceJedisPoolSelector{ Stringvalue(); } JedisPoolAspect 此类的目的是针对主和从的注解,进行动态链接池调配,即主的使用主链接池,从的使用从连接池。 packagecom.silence.spring.redis.readwriteseparation;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importredis.clients.jedis.JedisPool;importjavax.annotation.PostConstruct;importjava.lang.reflect.Method;importjava.util.Date;/** *Createdbykeysilenceon16/10/26. */@AspectpublicclassJedisPoolAspectimplementsApplicationContextAware{ privateApplicationContextctx;@PostConstruct publicvoidinit(){ System.out.println("jedispoolaspectjstarted@"+newDate()); }@Pointcut("execution(*com.silence.spring.redis.readwriteseparation.util.*.*(..))")privatevoidallMethod(){ }@Before("allMethod()")publicvoidbefore(JoinPointpoint) { Objecttarget=point.getTarget(); Stringmethod=point.getSignature().getName(); Classclassz=target.getClass(); Class<?>[]parameterTypes=((MethodSignature)point.getSignature()) .getMethod().getParameterTypes();try{ Methodm=classz.getMethod(method,parameterTypes);if(m!=null&&m.isAnnotationPresent(JedisPoolSelector.class)){ JedisPoolSelectordata=m .getAnnotation(JedisPoolSelector.class); JedisPooljedisPool=(JedisPool)ctx.getBean(data.value()); DynamicJedisPoolHolder.putJedisPool(jedisPool); } }catch(Exceptione){ e.printStackTrace(); } }publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this.ctx=applicationContext; } } DynamicJedisPoolHolder 此类目的是存储当前使用的JedisPool,即上面类赋值后的结果保存。 packagecom.silence.spring.redis.readwriteseparation;importredis.clients.jedis.JedisPool;/** *Createdbykeysilenceon16/10/26. */publicclassDynamicJedisPoolHolder{ publicstaticfinalThreadLocal<JedisPool>holder=newThreadLocal<JedisPool>();publicstaticvoidputJedisPool(JedisPooljedisPool){ holder.set(jedisPool); }publicstaticJedisPoolgetJedisPool(){returnholder.get(); } } RedisUtils 此类目的是对Redis具体的调用,里面包含使用主还是从的方式调用。 packagecom.silence.spring.redis.readwriteseparation.util;importcom.silence.spring.redis.readwriteseparation.DynamicJedisPoolHolder;importcom.silence.spring.redis.readwriteseparation.JedisPoolSelector;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;/** *Createdbykeysilenceon16/10/26. */publicclassRedisUtils{ privatestaticLoggerlogger=LoggerFactory.getLogger(RedisUtils.class); @JedisPoolSelector("master") publicStringsetString(finalStringkey,finalStringvalue){ Stringret=DynamicJedisPoolHolder.getJedisPool().getResource().set(key,value); System.out.println("key:"+key+",value:"+value+",ret:"+ret); returnret; } @JedisPoolSelector("slave") publicStringget(finalStringkey){ Stringret=DynamicJedisPoolHolder.getJedisPool().getResource().get(key); System.out.println("key:"+key+",ret:"+ret); returnret; } } spring-datasource.xml <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"> <beanid="poolConfig"class="redis.clients.jedis.JedisPoolConfig"> <!--池中最大链接数--> <propertyname="maxTotal"value="100"/> <!--池中最大空闲链接数--> <propertyname="maxIdle"value="50"/> <!--池中最小空闲链接数--> <propertyname="minIdle"value="20"/> <!--当池中链接耗尽,调用者最大阻塞时间,超出此时间将跑出异常。(单位:毫秒;默认为-1,表示永不超时)--> <propertyname="maxWaitMillis"value="1000"/> <!--参考:http://biasedbit.com/redis-jedispool-configuration/--> <!--调用者获取链接时,是否检测当前链接有效性。无效则从链接池中移除,并尝试继续获取。(默认为false)--> <propertyname="testOnBorrow"value="true"/> <!--向链接池中归还链接时,是否检测链接有效性。(默认为false)--> <propertyname="testOnReturn"value="true"/> <!--调用者获取链接时,是否检测空闲超时。如果超时,则会被移除(默认为false)--> <propertyname="testWhileIdle"value="true"/> <!--空闲链接检测线程一次运行检测多少条链接--> <propertyname="numTestsPerEvictionRun"value="10"/> <!--空闲链接检测线程检测周期。如果为负值,表示不运行检测线程。(单位:毫秒,默认为-1)--> <propertyname="timeBetweenEvictionRunsMillis"value="60000"/> <!--链接获取方式。队列:false;栈:true--> <!--<propertyname="lifo"value="false"/>--> </bean> <beanid="master"class="redis.clients.jedis.JedisPool"> <constructor-argindex="0"ref="poolConfig"/> <constructor-argindex="1"value="192.168.100.110"type="java.lang.String"/> <constructor-argindex="2"value="6379"type="int"/> </bean> <beanid="slave"class="redis.clients.jedis.JedisPool"> <constructor-argindex="0"ref="poolConfig"/> <!--此处Host配置成ELB地址--> <constructor-argindex="1"value="192.168.100.110"type="java.lang.String"/> <constructor-argindex="2"value="6380"type="int"/> </bean> <beanid="redisUtils"class="com.silence.spring.redis.readwriteseparation.util.RedisUtils"> </bean> <beanid="jedisPoolAspect"class="com.silence.spring.redis.readwriteseparation.JedisPoolAspect"/> <aop:aspectj-autoproxyproxy-target-class="true"/></beans> Test packagecom.silence.spring.redis.readwriteseparation;importcom.silence.spring.redis.readwriteseparation.util.RedisUtils;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;/** *Createdbykeysilenceon16/10/26. */publicclassTest{ publicstaticvoidmain(String[]args){ ApplicationContextctx=newClassPathXmlApplicationContext("spring-datasource.xml"); System.out.println(ctx); RedisUtilsredisUtils=(RedisUtils)ctx.getBean("redisUtils"); redisUtils.setString("aaa","111"); System.out.println(redisUtils.get("aaa")); } } 方式二,依赖注入 与方式一类似,但是需要写死具体使用主的池还是从的池,思路如下:放弃注解的方式,直接将主和从的两个链接池注入到具体实现类中。 RedisUtils packagecom.silence.spring.redis.readwriteseparation.util;importcom.silence.spring.redis.readwriteseparation.DynamicJedisPoolHolder;importcom.silence.spring.redis.readwriteseparation.JedisPoolSelector;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importredis.clients.jedis.JedisPool;/** *Createdbykeysilenceon16/10/26. */publicclassRedisUtils{ privatestaticLoggerlogger=LoggerFactory.getLogger(RedisUtils.class);privateJedisPoolmasterJedisPool;privateJedisPoolslaveJedisPool;publicvoidsetMasterJedisPool(JedisPoolmasterJedisPool){this.masterJedisPool=masterJedisPool; }publicvoidsetSlaveJedisPool(JedisPoolslaveJedisPool){this.slaveJedisPool=slaveJedisPool; }publicStringsetString(finalStringkey,finalStringvalue){ Stringret=masterJedisPool.getResource().set(key,value); System.out.println("key:"+key+",value:"+value+",ret:"+ret);returnret; }publicStringget(finalStringkey){ Stringret=slaveJedisPool.getResource().get(key); System.out.println("key:"+key+",ret:"+ret);returnret; } } spring-datasource.xml <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"> <beanid="poolConfig"class="redis.clients.jedis.JedisPoolConfig"> <!--池中最大链接数--> <propertyname="maxTotal"value="100"/> <!--池中最大空闲链接数--> <propertyname="maxIdle"value="50"/> <!--池中最小空闲链接数--> <propertyname="minIdle"value="20"/> <!--当池中链接耗尽,调用者最大阻塞时间,超出此时间将跑出异常。(单位:毫秒;默认为-1,表示永不超时)--> <propertyname="maxWaitMillis"value="1000"/> <!--参考:http://biasedbit.com/redis-jedispool-configuration/--> <!--调用者获取链接时,是否检测当前链接有效性。无效则从链接池中移除,并尝试继续获取。(默认为false)--> <propertyname="testOnBorrow"value="true"/> <!--向链接池中归还链接时,是否检测链接有效性。(默认为false)--> <propertyname="testOnReturn"value="true"/> <!--调用者获取链接时,是否检测空闲超时。如果超时,则会被移除(默认为false)--> <propertyname="testWhileIdle"value="true"/> <!--空闲链接检测线程一次运行检测多少条链接--> <propertyname="numTestsPerEvictionRun"value="10"/> <!--空闲链接检测线程检测周期。如果为负值,表示不运行检测线程。(单位:毫秒,默认为-1)--> <propertyname="timeBetweenEvictionRunsMillis"value="60000"/> <!--链接获取方式。队列:false;栈:true--> <!--<propertyname="lifo"value="false"/>--> </bean> <beanid="masterJedisPool"class="redis.clients.jedis.JedisPool"> <constructor-argindex="0"ref="poolConfig"/> <constructor-argindex="1"value="192.168.100.110"type="java.lang.String"/> <constructor-argindex="2"value="6379"type="int"/> </bean> <beanid="slaveJedisPool"class="redis.clients.jedis.JedisPool"> <constructor-argindex="0"ref="poolConfig"/> <constructor-argindex="1"value="192.168.100.110"type="java.lang.String"/> <constructor-argindex="2"value="6380"type="int"/> </bean> <beanid="redisUtils"class="com.silence.spring.redis.readwriteseparation.util.RedisUtils"> <propertyname="masterJedisPool"ref="masterJedisPool"/> <propertyname="slaveJedisPool"ref="slaveJedisPool"/> </bean></beans>

优秀的个人博客,低调大师

[PHP] Larval 主从读写分离配置

在DB的连接工厂中找到以下代码 .../vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php /** * Get the read configuration for a read / write connection. * * @param array $config * @return array */ protected function getReadConfig(array $config) { $readConfig = $this->getReadWriteConfig($config, 'read'); return $this->mergeReadWriteConfig($config, $readConfig); } /** * Get a read / write level configuration. * * @param array $config * @param string $type * @return array */ protected function getReadWriteConfig(array $config, $type) { if (isset($config[$type][0])) { return $config[$type][array_rand($config[$type])]; } return $config[$type]; } /** * Merge a configuration for a read / write connection. * * @param array $config * @param array $merge * @return array */ protected function mergeReadWriteConfig(array $config, array $merge) { return array_except(array_merge($config, $merge), ['read', 'write']); } 工厂类通过随机获取读DB配置来进行读取操作,由此可推出DB的配置应该如下 'mysql' => [ 'write' => [ 'host' => '192.168.1.180', ], 'read' => [ ['host' => '192.168.1.182'], ['host' => '192.168.1.179'], ], 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ] 加强版,支持多主多从,支持独立用户名和密码,配置如下 'mysql' => [ 'write' => [ [ 'host' => '192.168.1.180', 'username' => '', 'password' => '', ], ], 'read' => [ [ 'host' => '192.168.1.182', 'username' => '', 'password' => '', ], [ 'host' => '192.168.1.179', 'username' => '', 'password' => '', ], ], 'driver' => 'mysql', 'database' => 'database', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ] 验证开启MySQL的general-log,通过tail -f的方式监控log变化来确定配置是否生效

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle

Oracle

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。