On Mon, Feb 18, 2019 at 12:27 PM John Dale <jcdw...@gmail.com> wrote:

> Regarding clustering and state recovery, I opted some time ago to
> store session information in the database - I prefer full control over
> session state for security/obscurity reasons.
>
> Load balancing is straightforward this way.
>
> I'm not sure I would ever need more than 2 nodes for my purposes,
> though, since Java can address such a huge memory space.  It's an
> amazing computing environment now compared to what we had 20 years
> ago.


>

Thanks John, this is my motivation.  I really want the insight and load
balancing capability.

Do you use Redis for the DB or other?

HB





>
> On 2/18/19, Christopher Schultz <ch...@christopherschultz.net> wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA256
> >
> > Herb,
> >
> > On 2/18/19 13:59, Herb Burnswell wrote:
> >> On Fri, Feb 15, 2019 at 12:21 PM Christopher Schultz <
> >> ch...@christopherschultz.net> wrote:
> >>
> >> Herb,
> >>
> >> On 2/14/19 12:41, Herb Burnswell wrote:
> >>>>> Tomcat 8.5.23 RHEL   7.5
> >>>>>
> >>>>> We are looking to set up session management via Redisson to
> >>>>> offload the CPU consumption of using Tomcat's built in
> >>>>> clustering session management.  We have CPU licensing limits
> >>>>> and need to conserve as much CPU as possible.
> >>
> >> Dumb question: aren't you just going to move the CPU cycles to
> >> another system?
> >>
> >>
> >>> Thanks for the reply.  Short answer, yes.  But that is the idea.
> >>> We can only use 2 CPU's per application node (3 nodes) with our
> >>> licensing structure so we do not want to take cycles away from
> >>> the application to manage sessions.
> >
> > Okay, so if you move the session-management to another machine, you
> > don't have to pay app-license fees for the session-management server?
> > Fair enough.
> >
> > Just remember that you still need code "managing" sessions from your
> > Tomcat note to your Redisson server. I can't imagine that the
> > Tomcat->Resisson code would be any less complicated than the Tomcat ->
> > Tomcat code. You might want to validate that assumption before
> > committing any resources toward solving a problem by adding complexity
> > to your deployments.
> >
> >> Another dumb question: do you actually need clustering?
> >>
> >>
> >>> If I'm using the term correctly, yes.  The idea would be for HA
> >>> functionality; If users were connected to node 3 and the node
> >>> failed for some reason, their session would be picked up by node
> >>> 1 or 2 uninterrupted.  Sorry if I confused the intent.
> >
> > That's exactly what you will get.
> >
> > If you do NOT use clustering, a failed node will require the users who
> > were on the failed node to re-login to a surviving node. Only you can
> > determine whether that is an acceptable consequence of a failed node
> > for your users and application. I, as well as many others, have
> > decided that fail-over is such a rare event and logins such a
> > non-issue that introducing the complexity of clustering is not justified
> > .
> >
> >>>>> I have never set up a configuration this way, however I have
> >>>>> Redis set up and running as 1 Master, 1 Slave.  I seemingly
> >>>>> just need to point our application to it.  I have read this
> >>>>> doc on how to:
> >>>>>
> >>>>> https://github.com/redisson/redisson/tree/master/redisson-tomcat
> >>>>>
> >>>>>
> >>>>>
> > It seems pretty straight forward except for the redisson.conf
> >>>>> configuration:
> >>>>>
> >>>>> Add RedissonSessionManager into tomcat/conf/context.xml
> >>>>>
> >>>>> <Manager
> >>>>> className="org.redisson.tomcat.RedissonSessionManager"
> >>>>> configPath="${catalina.base}/redisson.conf" readMode="REDIS"
> >>>>> updateMode="DEFAULT"/>
> >>
> >> I would do this in the application's context.xml file instead of
> >> the global/default one. That means modifying the application's
> >> META-INF/context.xml file, or, if you deploy via files from
> >> outside your WAR/dir application, then
> >> conf/[engine]/[hostname]/[appname].xml.
> >>
> >>
> >>> Yes, this is requiring the editing a application specific xml
> >>> file.
> >
> > Good.
> >
> >>>>> I am more familiar with YAML so plan on configuring the
> >>>>> redisson.conf as such.  I have read the referenced
> >>>>> configuration wiki page:
> >>>>>
> >>>>> https://github.com/redisson/redisson/wiki/2.-Configuration
> >>>>>
> >>>>> However, it has a great deal of options and I'm not sure what
> >>>>> is and is not needed.
> >>>>>
> >>>>> I am reaching out here on the Tomcat user group to see if
> >>>>> anyone else is using Redisson for session management and if
> >>>>> maybe I can get some guidance on a basic redisson.conf
> >>>>> configuration.  I'd also be interested in comments on if
> >>>>> there are better options or things to watch out for.
> >>
> >> I don't have any experience with either Redis or Redisson, but what
> >> is wrong with the default/sample configuration you have provided
> >> above?
> >>
> >>
> >>> I have through much trial and error been using this config:
> >>
> >>> { "masterSlaveServersConfig":{ "idleConnectionTimeout":10000,
> >>> "connectTimeout":10000, "timeout":3000, "retryAttempts":3,
> >>> "retryInterval":1500, "failedSlaveReconnectionInterval":3000,
> >>> "failedSlaveCheckInterval":60000, "password":"<master_pass>",
> >>> "subscriptionsPerConnection":5, "clientName":true,
> >>> "subscriptionConnectionMinimumIdleSize":1,
> >>> "subscriptionConnectionPoolSize":50,
> >>> "slaveConnectionMinimumIdleSize":32,
> >>> "slaveConnectionPoolSize":64,
> >>> "masterConnectionMinimumIdleSize":32,
> >>> "masterConnectionPoolSize":64, "readMode":"SLAVE",
> >>> "subscriptionMode":"SLAVE", "slaveAddresses":[
> >>> "<slave.example.com:6379" ],
> >>> "masterAddress":"<master.example.com>:6379", "database":0 },
> >>> "threads":0, "nettyThreads":0, "transportMode":"NIO" }
> >>
> >>> However, I am getting a couple exceptions and am not sure what
> >>> might be the issue:
> >
> > Okay, let's take a look:
> >
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 | Feb 18,
> >>> 2019 10:09:33 AM org.apache.catalina.core.StandardContext
> >>> startInternal INFO   | jvm 1    | main    | 2019/02/18
> >>> 10:09:33.068 | SEVERE: The session manager failed to start
> >
> > Wow, this stack trace is tough to read. :(
> >
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |
> >>> org.apache.catalina.LifecycleException: Failed to start
> >>> component [org.redisson.tomcat.RedissonSessionManager[]] INFO   |
> >>> jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.apache.catalina.core.StandardContext.startInternal(StandardContex
> > t.java:5224)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.
> > java:1419)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.
> > java:1409)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> java.util.concurrent.FutureTask.run(FutureTask.java:266) INFO   |
> >>> jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
> > java:1149)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
> > .java:624)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> java.lang.Thread.run(Thread.java:748) INFO   | jvm 1    | main
> >>> | 2019/02/18 10:09:33.068 | Caused by:
> >>> org.apache.catalina.LifecycleException:
> >>> java.lang.NullPointerException INFO   | jvm 1    | main    |
> >>> 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.tomcat.RedissonSessionManager.buildClient(RedissonSessio
> > nManager.java:279)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.tomcat.RedissonSessionManager.startInternal(RedissonSess
> > ionManager.java:209)
> >
> > It
> >>>
> > looks like your SessionManager (from Redisson) is failing to start
> > up. If you can look at the source, you might be able to see some kind
> > of missing configuration parameter and fix it. Or you could ask the
> > Redisson community what you might be missing. I've never even heard of
> > Redisson and I've been on this list for ... 15 years. Perhaps someone
> > else here can chime-in and help, but I wouldn't bet on it.
> >
> > Or there could be a bug in Redisson. For that, you'll have to approach
> > that community for help, of course. I would consider a SessionManager
> > throwing an NPE to be a bug. If there is some kind of required
> > configuration, the SessionManager should emit a helpful message like
> > "masterAddress is required" or somesuch.
> >
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |
> >>> at
> >>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         ... 8 mo
> > re
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 | Caused
> >>> by: java.lang.NullPointerException
> >
> > Hmm, the plot thickens. The NPE is not in the SessionManager; it's in
> > the netty client?
> >
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |
> >>> at io.netty.util.NetUtil.isValidIpV4Address(NetUtil.java:648)
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |
> >>> at
> >>> io.netty.util.NetUtil.createByteArrayFromIpAddressString(NetUtil.java
> > :368)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.client.RedisClient.resolveAddr(RedisClient.java:172)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveEntry.addSlave(MasterSlaveEntry.ja
> > va:303)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveEntry.addSlave(MasterSlaveEntry.ja
> > va:345)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveEntry.initSlaveBalancer(MasterSlav
> > eEntry.java:102)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveConnectionManager.createMasterSlav
> > eEntry(MasterSlaveConnectionManager.java:372)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveConnectionManager.initSingleEntry(
> > MasterSlaveConnectionManager.java:346)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.connection.MasterSlaveConnectionManager.<init>(MasterSla
> > veConnectionManager.java:161)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.config.ConfigSupport.createConnectionManager(ConfigSuppo
> > rt.java:225)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.Redisson.<init>(Redisson.java:121) INFO   | jvm 1
> >>> | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.Redisson.create(Redisson.java:164) INFO   | jvm 1
> >>> | main    | 2019/02/18 10:09:33.068 |         at
> >>> org.redisson.tomcat.RedissonSessionManager.buildClient(RedissonSessio
> > nManager.java:277)
> >>>
> >>>
> > INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 |         ... 10 m
> > ore
> >>> INFO   | jvm 1    | main    | 2019/02/18 10:09:33.068 | INFO   |
> >>> jvm 1    | main    | 2019/02/18 10:09:33.068 | Feb 18, 2019
> >>> 10:09:33 AM org.apache.catalina.core.StandardContext
> >>> startInternal INFO   | jvm 1    | main    | 2019/02/18
> >>> 10:09:33.068 | SEVERE: Context [] startup failed due to previous
> >>> errors
> >
> > Yep, the issue is in the Netty client. It's failing while trying to
> > validate an IP address. Specifically for a slave's address (I gather
> > from reading the stack trace). Are you sure anything that looks like
> > it should be an IP address is correct? Can slaveAddresses have a port
> > number? Are there other "address" type configuration parameters that
> > must be set but that you haven't set to something? Maybe a port number?
> >
> > I still think an NPE is a very non-graceful handling, here, and I
> > would expect that the SessionManager would perform a sanity-check on
> > all values -- especially if they are required -- before using them to
> > e.g. make a network connection.
> >
> > Hope that helps,
> > - -chris
> > -----BEGIN PGP SIGNATURE-----
> > Comment: Using GnuPG with Thunderbird - https://www.enigmail.net/
> >
> > iQIzBAEBCAAdFiEEMmKgYcQvxMe7tcJcHPApP6U8pFgFAlxrBsIACgkQHPApP6U8
> > pFg+Tg/+N3In8g4bowjSYL/qe+tPH/4S67FQQgK+Gh+JRtRB4SgJ0ie3N7OVr1OP
> > AculZNMIqDL2IkpFCRWOyctZSAh6dznzvy99CT1rLscEy1WYTwL93sPaEWrPGFsB
> > 1WuxdbPkONrG8D4PSDCe9714cj4yTmz6v7nXR1Oii3G6tu+0V+hg6bT5ton4Pw/K
> > uoDbsPKvg9f5nuGaVpG1ukHFxIANV3ShmJDmjDKcAypaNsOS7Fmsst6EeiZfmTjy
> > vZtLPBydzL+bgEhTdXdRXEcqmkA1QVA8HS8XtI9aXFhY5kdjs0U1ebiwoPz8k6Ln
> > NPd0js8FNO5GUhdJuCbOPEzkqRuLyR8hIdtyHQ1dJnJpOs0LtYoEEb5s+arIwuQX
> > rSvMfrIlOB9Za1fu03MGcHETDXqPR8ZHzHezqf8cxGUIrMKO0ZOQmkuC1SZA7O1v
> > HO2jQjiipXw2gQ00qM+9yruYyp5Dgf0qHS+5uy38ueBqcIw/cEgOGq8xgYB7qCNR
> > f4pkpTvvZvARpGTZFrCwvRvsovtdjpA6iNKElFZJXcN+F7kRa9/Kx4voOpbnLtJk
> > Pmu8ciFrZ1xtPCpYMOlY6+HcyIMfS3ip5qFm5ATPu4sqNtarzIRsWt7hfw8qTU64
> > etq2KDiGW8O0SAiuuCpZda47Bfg8A0wN9uEjJxiVznHIT8K+89E=
> > =xIZ2
> > -----END PGP SIGNATURE-----
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> > For additional commands, e-mail: users-h...@tomcat.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Reply via email to