hq450 / fancyss

fancyss is a project providing tools to across the GFW on asuswrt/merlin based router.
GNU General Public License v3.0
12.32k stars 3.18k forks source link

建议将手动添加的节点和订阅节点分开存储 #62

Closed PetrusZ closed 6 years ago

PetrusZ commented 6 years ago

只是一个建议,也许也有不少不成熟的地方,并且感觉会有不少工作量。但会解决订阅节点错乱bug以及订阅性能差的问题。

目前所有节点信息似乎都存到以ssconf_basic_为开头的key,这样会将手动添加和订阅添加的混杂在一起。更新订阅的时候也不能有效的将订阅节点分组,只能将订阅新添加的节点添加到最后,亦或者订阅节点被删除的时候,还必须调整节点顺序,效率非常差。这方面与小火箭对比,同样200左右个订阅节点,小火键每次更新只要几秒,而科学上网这边至少要十几分钟,如果节点要重新排序,则需要更长的时间。但根据论坛上关于skipd的测试,写入5000条数据只需2s,目前我200+节点大概只有3000+条数据。

我的想法是手动添加的节点仍使用以ssconf_basic_为开头的key,并仍使用之前的添加、删除方法,而订阅添加的节点可以使用以ssconf_subscription_等为开头的key。这样做在订阅/更新订阅的时候可以直接先删除所有订阅的节点(dbus list ssconf_subscription_)然后重新添加(如上所说skipd的速度似乎还不错),这样保证了每次更新订阅节点顺序都是正确的。并且在添加订阅时在脚本里使用$index++这种方法更新节点编号,而不是再去使用dbus计算当前使用到了哪个index(容易出bug),这样解决了订阅节点需要排序、订阅时容易出bug,订阅时间长等问题。为了进一步提高性能,建议去除订阅中的大部分echo_date日志,如无报错其实大部分用户不需要看这些日志(比如添加了哪些节点之类的)。

界面上的问题我不熟悉,不过也有一些想法。建议将节点管理tab分成两个tab,一个为手动添加的,一个为订阅添加的。或者在节点管理tab中分为两组,一组为手动添加,一组为订阅添加。有订阅节点的tab建议在其中加入滚动条,因为订阅节点多了以后没有滚动条不方便浏览/管理。

另看到似乎380的固件数据库以后会升级到skipdv3,不知道会带来什么影响。

hq450 commented 6 years ago

应该算是历史原因吧,首先skipd v1在380的merlin上真的有不少问题,skipd v3又换了数据库结构,不兼容的,如果要通过更新固件升级,那么就会导致之前的数据库被清空,软件中心安装的所有插件都会丢失。

然后skipd v1的几个问题: 1 本来ss相关的key都是ss打头储存的,但是有时候比如dbus list ss,打印的结果并不会分行,这和里面储存了什么数据有关,导致脚本去拿值得时候出现各种问题,节点订阅里就有这个问题,所以不得不更改要list数据的前缀来得到正确的结果。 2 skipd还会因为一些数据的储存崩掉,这个在skipd最新版本中才得到修复,因为lz4压缩的一个bug,一些值,比如插件的黑白名单,v2ray的json数据,这些都是先经过base64一次再进行储存,可以减少崩掉的概率,但是还是会有几率会崩,所以就有很多人出现的情况是,点击了提交,然后发现标签页都点击不能了,看F12调试信息才知道,是因为网页端拿不到skipd内的数据了,skipd进程崩掉了,重启skipd进程也不行,因为数据库里有引起skipd崩掉的数据。这种情况最多的就是建议格式化jffs分区,其实目的就是删掉db,重新来过 3 skipd v1当时虽然经过测试,写入性能上是没什么问题的,但是经过了这么久merlin软件中心的考验,问题其实真的多,如果一次写入数据量过大,或者持续性的写入,也会导致skipd崩掉,所以在订阅节点的脚本里,一些地方我加了sleep 1,这是导致订阅节点需要十几分钟的原因 4 现在openwrt by fw867用的是最新skipd v3,hnd平台是次新的skipd v3,tomato改版固件是v2,而最最新的应该是orbi软件中心的skipd了,改造成纯内存数据库,配置文件用 uci 来保存

然后说到节点信息储存,说白了还是考虑到版本之间的兼容性问题,还有以前写的节点管理的asp和js实在很烂,如果升级到新的方式,先不说因为skipd v1的原因,一样会限制速度的(sleep 1),插件3.6.4和3.6.5就存在数据的不兼容,插件在3.6.4升级3.6.5过程就有一次数据迁移,但是之前很多人拿着3.6.4之前的数据备份去在3.6.5里去恢复,这里又需要数据迁移一次。而且迁移的数据量大了,还是容易触发到上面那些问题,导致插件页面点不开,点击没反应等等。

所以现在的数据格式算是破罐破摔吧,也不想去升级他,不然牵扯到的数据过度又是很麻烦。还一个就是merlin 384的话,当然会用最新的内存型数据库,软件中心本身也会改变甚多(2.0),所以380也就不去管它了

虽然是可以给编译一个380的skipd v3,大家需要的话,可以自行替换,但是因为skipd v1是做进了merlin系统service,启动时间太早了,而要替换skipd v3,只有通过mount --bind来实现,替换的时间太晚了些。

hq450 commented 6 years ago

参考:http://koolshare.cn/thread-146411-1-1.html

PetrusZ commented 6 years ago
  1. 打引结果不会分行是什么情况?暂时没有见到过。
  2. 持续写入会崩掉?我看测试的时候写了几万行也没事啊。。。
  3. UCI看起来不太适合写入ss/r订阅这种大量数据的样子。不知道实际效果如何。

我建议的节点存储只是修改订阅相关的,这方面很好处理。只要把原来的订阅节点都删了,重新订阅即可,不需要数据迁移。

最后希望早日能升级上384和新的软件中心吧。

hq450 commented 6 years ago

1 看这里这个奇怪的写法:https://github.com/hq450/fancyss/blob/master/fancyss_arm/shadowsocks/scripts/ss_online_update.sh#L79 本来dbus list ssconf_basic_name_是ok的,但是现在要写成dbus list ssconf_basic_|grep _name_ 就是因为前者会触发打印出来的结果不会分行,新的写法貌似可以避免这个问题,才这么做 2 测试的时候是脚本循坏写入,写入的都是每次加1的数字,不会出什么问题,但是实际使用中,各种字符,中文的,特殊符号的,会导致问题的 3 uci的话现在orbi上是这么用的,openwrt也用uci,应该是值得信赖的,384上这个应该是没问题

现在的订阅都是以group来识别节点是否订阅,另外更换前缀的话,还是会遇到排序问题,比如某个中间节点用户自己删除了,或者机场删除了,那么就涉及到重新排序了;

384的话,首先是skipdv3 + uci,另外因为软件中心会引入uve.js,以后可以将页面写得更现代化一些,节点管理也更好处理,现在的网页代码已经很臃肿,想加一个在网页上实现节点排序的功能都很难下手了。所以还是希望能在384上另起炉灶,而不是在380上改来改去了。

另外会考虑380的X7.9固件升级一下skipd,数据由v1迁移到v3,不过需要推出新的固件,这个看ks开发组了,遇到太多人插件页面错乱,标签页点击无效,这个都是skipdv1的锅啊

PetrusZ commented 6 years ago

嗯。我也觉得等384上来重新改比较好。不过还是说说我的想法,感觉你好像没理解对。

现在的订阅都是以group来识别节点是否订阅,另外更换前缀的话,还是会遇到排序问题,比如某个中间节点用户自己删除了,或者机场删除了,那么就涉及到重新排序了;

其实不必重新排序,我的主要想法是更改前缀后每次更新的时候,先把有订阅前缀的信息都list出来,然后删掉,之后根据订阅重新添加。或者直接根据订阅replace现有数据,然后把多余的旧节点删掉。目前用group来识别无法做到这一点,因为手动添加和订阅添加混在一起了。另外用这种方式的话,订阅节点用户自己删除了其实也不影响什么,删掉的index空着应该也没影响。

hq450 commented 6 years ago

你的意思是每次订阅,先直接删除所有旧的订阅节点,然后订阅完成后直接再写进去,这样?

其实我最初理解你的想法是通过这个方式来加快订阅速度?如果那样的话,即使改前缀可能也不能加哭啊订阅速度吧,因为skipd的一堆问题在哪里。

PetrusZ commented 6 years ago

嗯,是这样,不光能加快订阅速度,也能简化不少代码。不过现在只是说说想法,原先不知道skipd问题这么多,而且看到更新订阅那里的代码写很复杂没有必要。

hq450 commented 6 years ago

说白了除了历史遗留问题,另一个问题就是比较懒了,这种没回报的东西,加上要修改繁琐的代码,点都不想动呢。哈哈

PetrusZ commented 6 years ago

嗯,可以理解。不过有时候把杂乱的东西整理干净了,心里也很舒坦呢。那就暂时先关闭这个issue了。

xiaoguazh commented 5 years ago

刚升级7.9.1 (EA6700/EA6500v2) 导出syslog.txt 发现如下问题: Ethernet link down, 至少每天出现一次. 在之前的7.9里不曾出现这个问题. 我用的是电信宽带,大伙有遇到吗?

Jan 28 22:28:27 WAN_Connection: Ethernet link down. Jan 28 22:28:27 stop_nat_rules: apply the redirect_rules! Jan 28 22:28:32 dnsmasq-dhcp[27368]: DHCPDISCOVER(br0) c0:ee:fb:d9:00:92 Jan 28 22:28:32 dnsmasq-dhcp[27368]: DHCPOFFER(br0) 192.168.2.118 c0:ee:fb:d9:00:92 Jan 28 22:28:32 dnsmasq-dhcp[27368]: DHCPREQUEST(br0) 192.168.2.118 c0:ee:fb:d9:00:92 Jan 28 22:28:32 dnsmasq-dhcp[27368]: DHCPACK(br0) 192.168.2.118 c0:ee:fb:d9:00:92 OnePlus_3 Jan 28 22:28:39 dnsmasq-dhcp[27368]: DHCPDISCOVER(br0) 38:37:8b:d2:76:96 Jan 28 22:28:39 dnsmasq-dhcp[27368]: DHCPOFFER(br0) 192.168.2.213 38:37:8b:d2:76:96 Jan 28 22:28:39 dnsmasq-dhcp[27368]: DHCPREQUEST(br0) 192.168.2.213 38:37:8b:d2:76:96 Jan 28 22:28:39 dnsmasq-dhcp[27368]: DHCPACK(br0) 192.168.2.213 38:37:8b:d2:76:96 HUAWEI_M5-8e68b410528a45c Jan 28 22:28:41 WAN_Connection: Ethernet link up. Jan 28 22:28:41 rc_service: wanduck 507:notify_rc restart_wan_if 0 Jan 28 22:28:42 miniupnpd[6573]: ioctl(s, SIOCGIFADDR, ...): Cannot assign requested address Jan 28 22:28:42 miniupnpd[6573]: Failed to get IP for interface vlan2 Jan 28 22:28:42 miniupnpd[6573]: SendNATPMPPublicAddressChangeNotification: cannot get public IP address, stopping Jan 28 22:28:42 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:28:43 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:28:47 WAN_Connection: ISP's DHCP did not function properly. Jan 28 22:28:56 WAN_Connection: Ethernet link up. Jan 28 22:28:56 rc_service: wanduck 507:notify_rc restart_wan_if 0 Jan 28 22:28:57 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:28:58 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:29:22 WAN_Connection: Ethernet link up. Jan 28 22:29:22 rc_service: wanduck 507:notify_rc restart_wan_if 0 Jan 28 22:29:22 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:29:23 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:29:29 custom_script: Running /jffs/scripts/wan-start (args: 0) Jan 28 22:29:29 rc_service: udhcpc 2502:notify_rc start_firewall Jan 28 22:29:29 dnsmasq[27368]: read /etc/hosts - 5 addresses Jan 28 22:29:29 miniupnpd[6573]: shutting down MiniUPnPd Jan 28 22:29:29 start_nat_rules: apply the nat_rules(/tmp/nat_rules_vlan2_vlan2)! Jan 28 22:29:30 custom_script: Running /jffs/scripts/nat-start Jan 28 22:29:31 rc_service: udhcpc 2502:notify_rc stop_upnp Jan 28 22:29:31 rc_service: waitting "start_firewall" via udhcpc ... Jan 28 22:29:31 miniupnpd[2675]: HTTP listening on port 36828 Jan 28 22:29:31 miniupnpd[2675]: Listening for NAT-PMP/PCP traffic on port 5351 Jan 28 22:29:32 rc_service: udhcpc 2502:notify_rc start_upnp Jan 28 22:29:32 rc_service: waitting "stop_upnp" via udhcpc ... Jan 28 22:29:32 miniupnpd[2675]: shutting down MiniUPnPd Jan 28 22:29:33 ntp: start NTP update Jan 28 22:29:33 dhcp_client: bound 192.168.1.2 via 192.168.1.1 during 604800 seconds. Jan 28 22:29:33 WAN_Connection: WAN was restored.

tomcati commented 5 years ago

大佬怎么安装v2ray 我要最新版本