https://redis.io/topics/cluster-spec

Redis Cluster does not support multiple databases like the stand alone version of Redis. There is just database 0 and the SELECT command is not allowed.

  1. 31367:M 05 May 13:50:37.300 * DB loaded from disk: 576.582 seconds
  2. 31367:M 05 May 13:50:37.300 # You can't have keys in a DB different than DB 0 when in Cluster mode. Exiting.

http://blog.csdn.net/yuyixinye/article/details/41114119

  1. int main(int argc, char **argv) {
  2. struct timeval tv;
  3. /* We need to initialize our libraries, and the server configuration. */
  4. // 初始化库
  5. #ifdef INIT_SETPROCTITLE_REPLACEMENT
  6. spt_init(argc, argv);
  7. #endif
  8. setlocale(LC_COLLATE,"");
  9. zmalloc_enable_thread_safeness();
  10. zmalloc_set_oom_handler(redisOutOfMemoryHandler);
  11. srand(time(NULL)^getpid());
  12. gettimeofday(&tv,NULL);
  13. dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
  14. // 检查服务器是否以 Sentinel 模式启动
  15. server.sentinel_mode = checkForSentinelMode(argc,argv);
  16. // 初始化服务器
  17. initServerConfig();
  18. /* We need to init sentinel right now as parsing the configuration file
  19. * in sentinel mode will have the effect of populating the sentinel
  20. * data structures with master nodes to monitor. */
  21. // 如果服务器以 Sentinel 模式启动,那么进行 Sentinel 功能相关的初始化
  22. // 并为要监视的主服务器创建一些相应的数据结构
  23. if (server.sentinel_mode) {
  24. initSentinelConfig();
  25. initSentinel();
  26. }
  27. // 检查用户是否指定了配置文件,或者配置选项
  28. if (argc >= 2) {
  29. int j = 1; /* First option to parse in argv[] */
  30. sds options = sdsempty();
  31. char *configfile = NULL;
  32. /* Handle special options --help and --version */
  33. // 处理特殊选项 -h 、-v 和 --test-memory
  34. if (strcmp(argv[1], "-v") == 0 ||
  35. strcmp(argv[1], "--version") == 0) version();
  36. if (strcmp(argv[1], "--help") == 0 ||
  37. strcmp(argv[1], "-h") == 0) usage();
  38. if (strcmp(argv[1], "--test-memory") == 0) {
  39. if (argc == 3) {
  40. memtest(atoi(argv[2]),50);
  41. exit(0);
  42. } else {
  43. fprintf(stderr,"Please specify the amount of memory to test in megabytes.\n");
  44. fprintf(stderr,"Example: ./redis-server --test-memory 4096\n\n");
  45. exit(1);
  46. }
  47. }
  48. /* First argument is the config file name? */
  49. // 如果第一个参数(argv[1])不是以 "--" 开头
  50. // 那么它应该是一个配置文件
  51. if (argv[j][0] != '-' || argv[j][1] != '-')
  52. configfile = argv[j++];
  53. /* All the other options are parsed and conceptually appended to the
  54. * configuration file. For instance --port 6380 will generate the
  55. * string "port 6380\n" to be parsed after the actual file name
  56. * is parsed, if any. */
  57. // 对用户给定的其余选项进行分析,并将分析所得的字符串追加稍后载入的配置文件的内容之后
  58. // 比如 --port 6380 会被分析为 "port 6380\n"
  59. while(j != argc) {
  60. if (argv[j][0] == '-' && argv[j][1] == '-') {
  61. /* Option name */
  62. if (sdslen(options)) options = sdscat(options,"\n");
  63. options = sdscat(options,argv[j]+2);
  64. options = sdscat(options," ");
  65. } else {
  66. /* Option argument */
  67. options = sdscatrepr(options,argv[j],strlen(argv[j]));
  68. options = sdscat(options," ");
  69. }
  70. j++;
  71. }
  72. if (configfile) server.configfile = getAbsolutePath(configfile);
  73. // 重置保存条件
  74. resetServerSaveParams();
  75. // 载入配置文件, options 是前面分析出的给定选项
  76. loadServerConfig(configfile,options);
  77. sdsfree(options);
  78. // 获取配置文件的绝对路径
  79. if (configfile) server.configfile = getAbsolutePath(configfile);
  80. } else {
  81. redisLog(REDIS_WARNING, "Warning: no config file specified, using the default config. In order to specify a config file use %s /path/to/%s.conf", argv[0], server.sentinel_mode ? "sentinel" : "redis");
  82. }
  83. // 将服务器设置为守护进程
  84. if (server.daemonize) daemonize();
  85. // 创建并初始化服务器数据结构
  86. initServer();
  87. // 如果服务器是守护进程,那么创建 PID 文件
  88. if (server.daemonize) createPidFile();
  89. // 为服务器进程设置名字
  90. redisSetProcTitle(argv[0]);
  91. // 打印 ASCII LOGO
  92. redisAsciiArt();
  93. // 如果服务器不是运行在 SENTINEL 模式,那么执行以下代码
  94. if (!server.sentinel_mode) {
  95. /* Things not needed when running in Sentinel mode. */
  96. // 打印问候语
  97. redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION);
  98. #ifdef __linux__
  99. // 打印内存警告
  100. linuxOvercommitMemoryWarning();
  101. #endif
  102. // 从 AOF 文件或者 RDB 文件中载入数据
  103. loadDataFromDisk();
  104. // 启动集群?
  105. if (server.cluster_enabled) {
  106. if (verifyClusterConfigWithData() == REDIS_ERR) {
  107. redisLog(REDIS_WARNING,
  108. "You can't have keys in a DB different than DB 0 when in "
  109. "Cluster mode. Exiting.");
  110. exit(1);
  111. }
  112. }
  113. // 打印 TCP 端口
  114. if (server.ipfd_count > 0)
  115. redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);
  116. // 打印本地套接字端口
  117. if (server.sofd > 0)
  118. redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
  119. } else {
  120. sentinelIsRunning();
  121. }
  122. /* Warning the user about suspicious maxmemory setting. */
  123. // 检查不正常的 maxmemory 配置
  124. if (server.maxmemory > 0 && server.maxmemory < 1024*1024) {
  125. redisLog(REDIS_WARNING,"WARNING: You specified a maxmemory value that is less than 1MB (current value is %llu bytes). Are you sure this is what you really want?", server.maxmemory);
  126. }
  127. // 运行事件处理器,一直到服务器关闭为止
  128. aeSetBeforeSleepProc(server.el,beforeSleep);
  129. aeMain(server.el);
  130. // 服务器关闭,停止事件循环
  131. aeDeleteEventLoop(server.el);
  132. return 0;
  133. }

redis主从架构及redis集群的更多相关文章

  1. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

  2. 关于redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  3. redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  4. Redis主从、哨兵、集群

    主从 命名设置:>6380 slaveof 127.0.0.01 6379 slaveof on one----------配置:-- 注意一点: 一定开启rdb,不能使用aof从节点配置:主节 ...

  5. redis主从同步故障切换及集群配置

    一.redis是一中高性能的缓存数据库, 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下 ...

  6. redis主从,哨兵,集群

    本次所有操作在docker下进行,搭建方便,迅速构建redis集群. 1. docker安装redis 获取redis:latest(使用官方最新的) 镜像 $ docker pull redis r ...

  7. Redis 主从,哨兵,集群实战

    下载地址及版本说明 Redis 各版本下载地址: http://download.redis.io/releases/ 版本说明:一般来说版本号第二位,偶数是稳定版本,奇数是在开发中的版本 本文基于R ...

  8. redis 主从、哨兵、集群

    出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...

  9. Redis主从、哨兵、集群的简单区别

    2018-10-26 主从:读写分离,备份哨兵:监控,自动转移,选主集群:数据 hash 分片,同时包含主从及哨兵特性

随机推荐

  1. MySQL四-1:数据类型

    阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 ...

  2. [C++]二维数组还是一维数组?

    记得刚学习C++那会这个问题曾困扰过我,后来慢慢形成了不管什么时候都用一维数组的习惯,再后来知道了在一维数组中提出首列元素地址进行二维调用的办法.可从来没有细想过这个问题,最近自己写了点代码测试下,虽 ...

  3. Mac OS X 安装Ruby

    安装CocoaPods第一步 起因:重装系统后需要重新安装CocoaPods网上搜了下发现很多都过时了,已经不能用了.而且taobao Gems源已经停止服务,现在有ruby-china提供服务 PS ...

  4. android.util.AndroidRuntimeException Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? com.uethinking.microvideo.manag

    记录学习,网络摘抄 碰到这个异常其实这个上面说的很清楚,加个flag 从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK ...

  5. android EditText控制最大输入行数

    网络摘抄,仅作记录学习 EditText在android开发中是一个经常用到的基础控件,功能也很强大,限制输入字符类型,字数什么的.但是最近在工作中遇到了需要控制editText最大可输入行数的要求. ...

  6. 如何简单的实现一个tab页title的动画效果

    首先我们来看看实现的效果 tab上的title沉下去的效果 先来看看布局 <?xml version="1.0" encoding="utf-8"?> ...

  7. git 常用使用命令

    http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html http://www.open-open.com/lib/view/open14 ...

  8. ios cocoapods获取不到最新库的原因主要有两个:

    获取不到最新库的原因主要有两个: 1.cocoapods的版本过低 2.还没有更新本地仓库 解决方法: 1.更新pods 在终端执行命令行 sudo gem install cocoapods 执行完 ...

  9. ios 动画 创建一个UIImageView并将其属性设置animationImages为UIImages 的数组

    NSArray *animationFrames = [NSArray arrayWithObjects: [UIImage imageWithName:@"image1.png" ...

  10. 去除app中的标题栏

    我之前一直用的是在oncreate方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE),并且必须写在setContentView(R.layout.a ...